Sql server 用户的SQL Server筛选器项
我有一个order表和一个orderItem表。我想得到一个用户的订单,这是下少于或 他们和拥有相同产品的人之间的时间等于2分钟产品数量必须匹配且与 他们Sql server 用户的SQL Server筛选器项,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个order表和一个orderItem表。我想得到一个用户的订单,这是下少于或 他们和拥有相同产品的人之间的时间等于2分钟产品数量必须匹配且与 他们 基于此,我能够成功地过滤出使用SQL FIDLE放置的顺序,我想出了这个 with Ordered as ( select OrderNumber, OrderDateTime, UserId, LAG(OrderDateTime,1) over ( partition by UserId
基于此,我能够成功地过滤出使用SQL FIDLE放置的顺序,我想出了这个
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 FIDLE没有包含数量,因此我没有在查询中包含数量,但如果需要,您可以添加数量。嘿,非常感谢您的回答,我希望将4444和5555放在两个单独的行中,我不关心duplicateOrderNumber列。这可能吗?问题是知道要加入的订单号。我的建议是从这个查询中获取结果,然后选择与DuplicateOrderNumber列联合的OrderNumber列,或者取消对结果的IVOT。
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
)