SQL查询以获取给定日期的状态

时间:2012-12-04 15:33:21

标签: sql sql-server sql-server-2008-r2

我确信之前已经回答过,但找不到它。

我有一个项目表,每隔几周改变一次状态。我想看一下任意一天,弄清楚每个状态中有多少项目。

例如:

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

1 个答案:

答案 0 :(得分:3)

对于任意一天,你可以这样做:

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