web-dev-qa-db-ja.com

数週間以内に配達される注文を見つける

私はミルの問題を単純に実行したと思っていましたが、それをスライスする方法を理解することができません。 OrderNumberDeliveryNumber、および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万行を超えるとは思えません。

3
Black Dynamite

次のクエリを試してください

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 
1
Graham