2012-12-05 22 views
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。我正在考慮使用for循環,但基於我在論壇上看到的一些創造性答案,我懷疑這是正確的方式。

我使用SQL Server 2008R2

我環顧四周,我認爲這是類似於這樣的問題:https://stackoverflow.com/questions/11183164/show-data-change-over-time-in-a-chart但一個不好回答。有沒有辦法做這些事情?

+0

明白了。我只是在等待再聽一遍。謝謝你的提示 – user46372

回答

0

一個同事向我展示了一個很酷的方式做到這一點,所以我想我會把它回饋社會:

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