Newbie: Cache event-change table with every date

心不动则不痛 提交于 2019-12-11 05:57:18

问题


I have a table of items which change status every few weeks. I want to look at an arbitrary day and figure out how many items were in each status.

For example:

tbl_ItemHistory

ItemID
StatusChangeDate
StatusID

Sample data:

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
...

So I need to figure out how many items were in each status for a given day. So on 5/1/2010, there was one item (1001) in status 2 and one item in status 1 (1002).

I want to create a cached table every night that has a row for every item and every day of the year so I can show status changes over time in a chart. I don't know much about SQL. I was thinking about using a for loop, but based on some of the creative answers I've seen on the forum, I doubt that's the right way.

I'm using SQL Server 2008R2

I looked around and I think this is similar to this question: https://stackoverflow.com/questions/11183164/show-data-change-over-time-in-a-chart but that one wasn't answered. Is there a way to do these things?


回答1:


A coworker showed me a cool way to do it so I thought I would contribute it to the community:

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


来源:https://stackoverflow.com/questions/13726432/newbie-cache-event-change-table-with-every-date

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!