我有一个项目表,每隔几周改变一次状态。我想看一下任意一天,弄清楚每个状态中有多少项目。
例如:
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 :(得分: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