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に1つのアイテム(1001)があり、ステータス1(1002)に1つのアイテムがありました。

毎晩キャッシュされたテーブルを作成し、すべてのアイテムと1年の毎日の行を作成して、時間の経過に伴うステータスの変化をグラフで表示できるようにします。SQLについてはよくわかりません。forループを使用することを考えていましたが、フォーラムで見た創造的な回答のいくつかに基づいて、それが正しい方法であるとは思えません。

SQLServer2008R2を使用しています

私は周りを見回しましたが、これはこの質問に似ていると思います:https ://stackoverflow.com/questions/11183164/show-data-change-over-time-in-a-chart しかし、それは答えられませんでした。これらのことを行う方法はありますか?

4

1 に答える 1

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
于 2012-12-06T18:08:08.947 に答える