使用您的SQL小提琴,我想出了這個...
with Ordered as (
select
OrderNumber,
OrderDateTime,
UserId,
LAG(OrderDateTime,1) over (
partition by UserId
order by OrderDateTime
) as prev_time,
LEAD(OrderDateTime,1) over (
partition by UserId
order by OrderDateTime
) as next_time,
LAG(OrderNumber,1) over (
partition by UserId
order by OrderDateTime
) as prev_OrderNumber,
LEAD(OrderNumber,1) over (
partition by UserId
order by OrderDateTime
) as next_OrderNumber
from [Order]
),
PossibleDuplicateOrders as (
SELECT OrderNumber,
OrderDateTime,
UserId,
CASE
WHEN DATEDIFF(MINUTE,OrderDateTime,next_time) <= 2 THEN next_OrderNumber
WHEN DATEDIFF(MINUTE,prev_time,OrderDateTime) <= 2 THEN prev_OrderNumber
ELSE null
END as DuplicateOrderNumber
FROM Ordered
WHERE DATEDIFF(MINUTE,OrderDateTime,next_time) <= 2 --this says if the next value is less than or equal to two minutes away return it
OR DATEDIFF(MINUTE,prev_time,OrderDateTime) <= 2 --this says if the prev value is less than or equal to 2 minutes away return it
)
select *
from PossibleDuplicateOrders PDO
where NOT EXISTS (
SELECT *
FROM Order_Item OI_Left
LEFT JOIN Order_Item OI_Right
ON OI_Right.OrderNumber = PDO.DuplicateOrderNumber
AND OI_Right.ProductID = OI_Left.ProductID
WHERE OI_Left.OrderNumber = PDO.OrderNumber
AND OI_Right.ProductID is NULL
)
and NOT EXISTS (
SELECT *
FROM Order_Item OI_Left
LEFT JOIN Order_Item OI_Right
ON OI_Right.OrderNumber = PDO.OrderNumber
AND OI_Right.ProductID = OI_Left.ProductID
WHERE OI_Left.OrderNumber = PDO.DuplicateOrderNumber
AND OI_Right.ProductID is NULL
)
從我所看到的情況來看,只有訂單4444和5555應該被視爲您的標準重複。 (彼此在2分鐘之內並且有匹配的項目。)您的SQL小提琴沒有包含數量,所以我沒有將它們包含在我的查詢中,但是如果您需要它們,您可以將它們添加進去。
嘿,非常感謝您的回答,我想要在兩個單獨的行中有4444和5555,我不在乎duplicateOrderNumber列。是否有可能? – user1527762
問題在於瞭解要加入的訂單號碼。我的建議是從這個查詢中得到結果,然後選擇帶有DuplicateOrderNumber列的UNIONed的OrderNumber列,或UNPIVOT結果。 – DeadZone