2015-04-22 61 views
1

我有一个订单表和一个orderItem表。我想获得一个用户的订单,这些用户的订单少于或等于它们之间的2分钟,并且它们与 相关联的产品(产品数量必须匹配)相同。SQL Server为用户筛选项目

基于此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

回答

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小提琴没有包含数量,所以我没有将它们包含在我的查询中,但是如果您需要它们,您可以将它们添加进去。

+0

嘿,非常感谢您的回答,我想要在两个单独的行中有4444和5555,我不在乎duplicateOrderNumber列。是否有可能? – user1527762

+0

问题在于了解要加入的订单号码。我的建议是从这个查询中得到结果,然后选择带有DuplicateOrderNumber列的UNIONed的OrderNumber列,或UNPIVOT结果。 – DeadZone