我有一个订单表和一个orderItem表。我想获得一个低于或低于的用户的订单 它们之间相等于2分钟,并且具有相同的产品(产品数量也必须匹配) 它们。
基于这个question,我能够成功地过滤出与用户相距<= 2分钟的顺序。但我无法弄清楚如何能够获得与其相关产品相关的用户的订单。
我期待像
这样的输出OrderNumber OrderDateTime UserId
1111 April, 28 2012 09:00:00 1
3333 April, 28 2012 09:03:00 1
4444 April, 28 2012 09:40:00 2
5555 April, 28 2012 09:42:00 2
以下是我到目前为止所尝试的内容:Sql Fiddle
答案 0 :(得分:1)
使用你的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小提琴不包含数量,因此我没有将它们包含在我的查询中,但如果您需要,可以添加它们。