我在SQL Server数据库中有一个历史表,我需要从不同月份获取信息,例如我有一个EmployeeHistory表,这个表有我为每个员工做的任何更新的记录.在一个月内我可以有很多更新,但我只有最新的更新.例如,我在一个月内没有做任何更新,我展示了我获得该月的最新更新.
例如
ID Name Email Date
1 A a@hotmail.com 2013-01-10
1 A new@hotmail.com 2013-01-20
1 A n1@hotmail.com 2013-03-15
在这种情况下,我在2月份没有任何变化,但我需要使用与1月相同的数据,在这种情况下,1月份的最新版本应该在2月份重复,因此查询应该带来以下结果:
ID Name Email Date
1 A new@hotmail.com 2013-01-20
1 A new@hotmail.com 2013-01-20
1 A n1@hotmail.com 2013-03-15
如何为这些案例构建查询?
谢谢.
最佳答案 要创建月份序列,您可以使用系统表master..spt_values或您自己的序列表.因此,无论是否有变化,您都可以找到所有月份的值
SELECT DATENAME(mm, DATEADD(mm, v.number-1, '20010101')) AS mName,
o.Id, o.Email, o.[Date]
FROM master..spt_values v
OUTER APPLY(
SELECT h3.Id, h3.NAME, h3.Email, h3.Date
FROM (
SELECT h.Id, MAX(h.[Date]) AS [Date]
FROM dbo.EmployeeHistory h
WHERE MONTH(h.[Date]) <= v.number
GROUP BY h.Id
) h2 JOIN dbo.EmployeeHistory h3
ON h2.Id = h3.Id AND h2.Date = h3.Date
) o
WHERE v.[type] = 'P' AND v.number BETWEEN 1 AND 12
为了获得更好的性能,您可以使用以下索引:
CREATE INDEX x ON dbo.EmployeeHistory(Id, [Date]) INCLUDE(Name, Email)
请参阅SQLFiddle
上的演示