使用您的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