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年の毎日の行を持つキャッシュテーブルを作成できますか?それが最善かどうか、またはそれを行う方法はわかりませんが

SQLServer2008R2を使用しています

4

1 に答える 1

3

任意の日に、次のようなことができます。

select ih.*
from (select ih.*,
             row_number() over (partition by itemId order by StatusChangeDate desc) as seqnum
      from tbl_ItemHistory ih
      where StatusChangeDate <= @YOURDATEGOESHERE
     ) ih
where seqnum = 1

アイデアは、 を使用して、日付以前のすべての履歴レコードを列挙することrow_nubmerです。順序は逆の年代順であるため、最新のレコード (日付以前) の値は 1 です。

次に、クエリは値が 1 のレコードを選択します。

結果を集計してその日付の各ステータスを取得するには、次を使用します。

select statusId, count(*)
from (select ih.*,
             row_number() over (partition by itemId order by StatusChangeDate desc) as seqnum
      from tbl_ItemHistory ih
      where StatusChangeDate <= @YOURDATEGOESHERE
     ) ih
where seqnum = 1
group by StatusId
于 2012-12-04T15:40:07.500 に答える