sql – 从表中获取历史数据

我在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上的演示

点赞