我在 SQL Server 数据库中有一个 History 表,我需要从不同月份获取信息,例如我有一个 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 上查看演示

关于sql - 从表中获取历史数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18092070/

10-11 02:59
查看更多