[英]SQL query to get status as of a given date
我确信之前已经回答过,但是找不到它。
我有一个项目表,每隔几周改变一次状态。 我想看看任意一天,并弄清楚每个状态中有多少项目。
例如:
tbl_ItemHistory
ItemID
StatusChangeDate
StatusID
样本数据:
1001, 1/1/2010, 1
1001, 4/5/2010, 2
1001, 6/15/2010, 4
1002, 4/1/2010, 1
1002, 6/1/2010, 3
...
所以我需要弄清楚某一天每个状态中有多少项目。 因此,在2010年5月1日,状态2中有一个项目(1001),状态1中有一个项目(1002)。
由于这些项目不会经常更改状态,也许我可以每晚创建一个缓存表,每个项目和一年中的每一天都有一行? 我不确定那是最好还是如何做到这一点
我正在使用SQL Server 2008R2
对于任意一天,您可以这样做:
select ih.*
from (select ih.*,
row_number() over (partition by itemId order by StatusChangeDate desc) as seqnum
from tbl_ItemHistory ih
where StatusChangeDate <= @YOURDATEGOESHERE
) ih
where seqnum = 1
我们的想法是使用row_nubmer
枚举日期或之前的每个历史记录。 排序顺序是按时间顺序排列的,因此最新记录 - 在日期之前或之前 - 的值为1。
然后查询只选择值为1的记录。
要汇总结果以获取日期的每个状态,请使用:
select statusId, count(*)
from (select ih.*,
row_number() over (partition by itemId order by StatusChangeDate desc) as seqnum
from tbl_ItemHistory ih
where StatusChangeDate <= @YOURDATEGOESHERE
) ih
where seqnum = 1
group by StatusId
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.