查找重复订单(按时间接近)

Ben*_*ish 7 sql sql-server

我有一张订单表,我知道这些订单有重复

    customer   order_number   order_date
   ----------  ------------   -------------------
          1             1     2012-03-01 01:58:00
          1             2     2012-03-01 02:01:00
          1             3     2012-03-01 02:03:00
          2             4     2012-03-01 02:15:00
          3             5     2012-03-01 02:18:00
          3             6     2012-03-01 04:30:00
          4             7     2012-03-01 04:35:00
          5             8     2012-03-01 04:38:00
          6             9     2012-03-01 04:58:00
          6            10     2012-03-01 04:59:00
Run Code Online (Sandbox Code Playgroud)

我想找到所有重复项(由彼此在60分钟内由同一客户订购).结果集由"重复"行组成,或者是一组具有重复数量的所有客户.

这是我尝试过的

SELECT
   customer,
   count(*)
FROM
   orders
GROUP BY
   customer,
   DATEPART(HOUR, order_date)
HAVING (count(*) > 1)
Run Code Online (Sandbox Code Playgroud)

当副本彼此在60分钟内但在不同时间即1:58和2:02时,这不起作用

我也试过这个

SELECT
  o1.customer,
  o1.order_number,
  o2.order_number,
  DATEDIFF(MINUTE,o1.order_date, o2.order_date) AS [diff]
FROM
  orders o1 LEFT OUTER JOIN
  orders o2 ON o1.customer = o2.customer AND o1.order_number <> o2.order_number
WHERE
  ABS(DATEDIFF(MINUTE,o1.order_date, o2.order_date)) < 60
Run Code Online (Sandbox Code Playgroud)

现在这给了我所有的重复项,但它也给了我每个重复订单多行.即(o1,o2)和(o2,o1),如果没有多个重复的订单,那就不会那么糟糕.在那些情况下,我得到(o1,o2),(o1,o3),(o2,o1),(o2,o3),(o3,o1),(o3,o2)等.我得到了所有的排列.

有人有见识吗?我不一定在这里寻找表现最好的答案,只有一个有效.

Mat*_*lie 3

SELECT
  *,
  CASE WHEN EXISTS (SELECT *
                      FROM orders AS lookup
                     WHERE customer    = orders.customer
                       AND order_date <  orders.order_date
                       AND order_date >= DATEADD(hour, -1, order_date)
                   )
       THEN 'Principle Order'
       ELSE 'Duplicate Order'
  END as Order_Status
FROM
  orders
Run Code Online (Sandbox Code Playgroud)

使用EXISTS相关子查询,您可以检查过去一小时内是否有任何先前的订单。