SQL Server筛选用户的项目

时间:2015-04-22 18:01:00

标签: sql-server sql-server-2012

我有一个订单表和一个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

1 个答案:

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