我在 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/