我想找到客户,例如系统错误地注册了订单重复项。
这很简单,如果reg_date完全相同,但是我不知道如何在查询中实现它,例如,如果事务之间有多达1秒的差异,就算是重复项。
select * from
(select customer_id, reg_date, count(*) as cnt
from orders
group by 1,2
) x where cnt > 1
这是示例数据集: https://www.db-fiddle.com/f/m6PhgReSQbVWVZhqe8n4mi/0
由于客户的reg_date相同,因此目前仅将客户的104个订单计为重复订单,我也要计算1,2和4,5订单,因为它们之间只有1秒的差异
答案 0 :(得分:2)
SELECT
customer_id,
reg_date
FROM (
SELECT
*,
reg_date - lag(reg_date) OVER (PARTITION BY customer_id ORDER BY reg_date) <= interval '1 second' as is_duplicate
FROM
orders
) s
WHERE is_duplicate
使用lag()
window function。它允许您回顾以前的记录。使用此值,您可以进行比较并过滤比较时间超过一秒的记录。
答案 1 :(得分:0)
尝试以下脚本。这将为您返回按日/按客户计算的重复项。
SELECT
TO_CHAR(reg_date :: DATE, 'dd/mm/yyyy') reg_date,
customer_id,
count(*) as cnt
FROM orders
GROUP BY
TO_CHAR(reg_date :: DATE, 'dd/mm/yyyy'),
customer_id
HAVING count(*) >1