私はミルの問題を単純に実行したと思っていましたが、それをスライスする方法を理解することができません。 OrderNumber
、DeliveryNumber
、およびDeliveryDate
を含む配信のテーブルがあるとします。私が聞きたい質問は"どのOrderNumbersにDeliverDatesがあり、すべて同じ週ではない"です。
これがテストスクリプトです。
DECLARE @DeliveryTable Table
(
OrderNumber INT,
DeliveryNumber INT,
DeliveryDate Date
)
;
INSERT INTO @DeliveryTable
(OrderNumber, DeliveryNumber, DeliveryDate)
VALUES
(1,300, '2020-04-27'),
(1,301, '2020-04-28'),
(1,302, '2020-04-30'),
(4,730, '2020-04-26'),
(4,731, '2020-04-28'),
(4,732, '2020-05-05')
;
「2020-05-05」は「2020-04-28」および「2020-04-26」と同じ週にないため、私のクエリはOrderNumber = {4}を返します。すべての配達が同じ週にあるため、OrderNumber 1は返されません。
LEAD/LAG関数の使用を検討しましたが、任意の数の配信が存在する可能性があるため、LEAD/LAGまでの距離がわかりません。ある種の結合を使用することを考えていましたが、( ..DATEPART(WK, first.DeliveryDate) <> DATEPART(WK, second.DeliveryDate)..)
以外に何を結合するのかわかりませんが、140万行を超えるとは思えません。
次のクエリを試してください
SELECT OrderNumber
FROM @DeliveryTable
GROUP BY OrderNumber
HAVING DATEPART(WEEK, MIN(DeliveryDate)) < DATEPART(WEEK, max(DeliveryDate))
Date-diffを計算すると、日曜日と次の月曜日の差を比較すると1が返されますが、これらの日は異なる週であるため、誤った結果になる可能性があります。
これは、1年おきに配達日をサポートするArtashes Khachtryanの回答の代替案です。それが問題でなければ、他のメリットはありません。
SELECT OrderNumber
FROM @DeliveryTable
GROUP BY OrderNumber
HAVING COUNT(DISTINCT DATEADD(D, -DATEPART(Weekday, DeliveryDate), DeliveryDate)) > 1