我有一张知道有重复的订单表
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
我想查找所有重复项(彼此在60分钟内由同一位客户订购)。由“重复”行组成的结果集,或者是一组具有重复总数的所有客户。
这是我尝试过的
SELECT
customer,
count(*)
FROM
orders
GROUP BY
customer,
DATEPART(HOUR, order_date)
HAVING (count(*) > 1)
当重复项之间的间隔在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
现在,这给了我所有的重复项,但是每个重复的订单项还给了我多行。即(o1,o2)和(o2,o1)如果没有多个重复的订单不会太糟糕。在那些情况下,我得到(o1,o2),(o1,o3),(o2,o1),(o2,o3),(o3,o1),(o3,o2)等。我得到了所有排列。
有人有见识吗?我不一定要在这里寻找效果最好的答案,只是一个可行的答案。
最佳答案
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
使用
EXISTS
和相关的子查询,您可以检查过去一小时内是否有任何先前的订单。