3

長年の読者、初めてのポスター。SQL の第一人者が、カーソルを使わずに SQL の問題をエレガントに解決するための処理能力を貸してくれることを願っています。

お金と日付のデータセットから時系列タイプの結果セットを作成しようとしていますが、それらが表示される順序が重要です。以下のサンプルデータと期待値を参照してください。

DECLARE @OrderData TABLE(
      ID                      INT IDENTITY,
      ProductId               INT,
      WarehouseId             INT,
      Cost MONEY,
      SaleDate          DATETIME
)

 

INSERT INTO @OrderData
VALUES
      (1, 1, 2.71, '2012-02-23 10:01')
      ,(1, 2, 2.71, '2012-02-23 10:02')
      ,(1, 1, 2.71, '2012-02-23 10:03')
      ,(1, 1, 2.71, '2012-02-23 10:04')
      ,(1, 1, 2.71, '2012-02-23 10:05')
      ,(1, 1, 2.8, '2012-02-23 10:06')
      ,(1, 1, 2.9, '2012-02-23 10:07')
      ,(1, 1, 2.71, '2012-02-23 10:08')
      ,(1, 1, 2.71, '2012-02-23 10:09')

私が探している結果は、独自の販売セット内の製品と倉庫の組み合わせの開始日と終了日を含む販売の時系列です。データセットで販売価格が変更されるとすぐに、結果セットに新しい行が生成されます。

サンプル データの結果構造。

Product, warehouse, minsale date, Max sale date
1,1,2.71, 2012-02-23 10.01, 2012-02-23 10.05
1,1,2.80, 2012-02-23 10.06, 2012-02-23 10.06
1,1,2.90, 2012-02-23 10.07, 2012-02-23 10.07
1,1,2.71, 2012-02-23 10.08, 2012-02-23 10.09
1,2,2.71, 2012-02-23 10.02, 2012-02-23 10.02

利用可能なヘルプを乾杯します。

4

1 に答える 1

4

これは「ギャップと島」の問題です。

select ProductID, WarehouseId, cost, MIN(saledate), MAX(saledate) from
(      
    select *,
        ROW_NUMBER() over (order by saledate)-
        ROW_NUMBER() over (partition by cost order by saledate) grp
    from @OrderData
) v
group by ProductID, WarehouseId, grp, cost
order by WarehouseID, MIN(SaleDate)

詳細については、「ギャップと島 by itzik ben-gan」で検索してください。

于 2012-10-29T10:06:34.573 に答える