Sql 新手:缓存每个日期的事件更改表

Sql 新手:缓存每个日期的事件更改表,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个每几周改变状态的项目表。我想看看任意的一天,找出每个状态下有多少个项目 例如: tbl_项目历史 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日,有一个项目1001处于状态2,一个项目处于

我有一个每几周改变状态的项目表。我想看看任意的一天,找出每个状态下有多少个项目

例如:

tbl_项目历史

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日,有一个项目1001处于状态2,一个项目处于状态1002

我想每天晚上创建一个缓存表,每个项目和一年中的每一天都有一行,这样我就可以在图表中显示状态随时间的变化。我对SQL了解不多。我曾考虑使用for循环,但根据我在论坛上看到的一些创造性答案,我怀疑这是正确的方法

我正在使用SQLServer2008R2


我环顾四周,我认为这与这个问题相似:但那个问题没有得到回答。有什么方法可以做这些事情吗?

一位同事向我展示了一种很酷的方法,所以我想我会为社区做出贡献:

declare @test table (ItemID int, StatusChangeDate datetime, StatusId tinyint);
insert @test values
(1001, '1/1/2010', 1),
(1001, '4/5/2010', 2),
(1001, '6/15/2010', 4),
(1002, '4/2/2010', 1),
(1002, '6/1/2010', 3);
with
itzik1(N) as (
    select 1 union all select 1 union all
    select 1 union all select 1), --4
itzik2(N) as (select 1 from itzik1 i cross join itzik1), --16
itzik3(N) as (select 1 from itzik2 i cross join itzik2), --256
itzik4(N) as (select 1 from itzik3 i cross join itzik3), --65536 (184 years)
tally(N) as (select row_number() over (order by (select null)) from itzik4)
select ItemID, StatusChangeDate, StatusId from(
    select
    test.ItemID,
    dates.StatusChangeDate,
    test.StatusId,
    row_number() over (
        partition by test.ItemId, dates.StatusChangeDate
        order by test.StatusChangeDate desc) as rnbr
    from @test test
    join (
        select dateadd(dd, N,
            (select min(StatusChangeDate) from @test) --First possible date
            ) as StatusChangeDate
        from tally) dates
    on test.StatusChangeDate <= dates.StatusChangeDate
    and dates.StatusChangeDate <= getdate()
) result
where rnbr = 1

知道了。我只是想再听到一条消息。谢谢你的提示