0

各記事の現在の在庫を保持する記事テーブルがあります。その特定の商品の在庫がなくなった後、新しい在庫が到着した最後の日付を知る必要があります。

テーブルはこんな感じ。

+-----------+-----------------+-------+
| ArticleID |    StockDate    | Stock |
+-----------+-----------------+-------+
|         1 | 1/1/2012 10:15  |   100 |
|         1 | 2/1/2012 13:39  |   -50 |
|         1 | 2/1/2012 15:17  |   -50 |
|         1 | 4/1/2012 08:05  |   100 |
|         2 | 5/1/2012 09:48  |    50 |
|         1 | 6/1/2012 14:21  |   -25 |
|         1 | 7/1/2012 16:01  |    10 |
|         2 | 8/1/2012 13:42  |   -10 |
|         1 | 9/1/2012 09:56  |   -85 |
|         1 | 13/1/2012 08:12 |   100 |
|         1 | 13/1/2012 10:50 |   -15 |
+-----------+-----------------+-------+

出力は次のようになります。

+-----------+-----------------+
| ArticleID |    StockDate    |
+-----------+-----------------+
|         2 | 5/1/2012 09:48  |
|         1 | 13/1/2012 08:12 |
+-----------+-----------------+

この出力はどのようにして取得しましたか?ArticleID 1の在庫は100でしたが、2012年2月1日15:17に初めて0に達しました。その後、新しい在庫が到着し、2012年9月1日09:56に再び0になりました。したがって、結果には、ArticleIDでグループ化された最後の空の在庫の後の最初の日付が表示されます。ArticleID 2には0ポイントがなかったため、最初の在庫日が表示されます。

他のクエリと結合できる結果セットが必要です。したがって、ストアドプロシージャは機能しません。

4

1 に答える 1

1
select ArticleID,stockdate from 
(
    select t.ArticleID, t.stockdate, ROW_NUMBER() Over (partition by t.articleid order by v.articleid desc, stockdate) rn
    from yourtable t
    left join 
    (
        select ArticleID, MAX(stockdate) as msd from yourtable t1
        cross apply (select sum(stock) as stockrt from yourtable where stockdate<=t1.stockdate and ArticleID=t1.ArticleID) rt
        where stockrt = 0
        group by articleid
    ) v
    on t.ArticleID = v.ArticleID
    and t.stockdate>v.msd
) v
where rn=1
于 2012-10-04T08:13:31.400 に答える