1

我敢肯定这已经被回答过,但找不到。

我有一张每几周更改一次状态的项目表。我想查看任意一天并弄清楚每个状态有多少项目。

例如:

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

4

1 回答 1

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
于 2012-12-04T15:40:07.500 回答