2015-04-22 52 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