查找具有相似日期值的行

时间:2019-05-13 12:08:21

标签: sql postgresql-9.4

我想找到客户,例如系统错误地注册了订单重复项。

这很简单,如果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秒的差异

2 个答案:

答案 0 :(得分:2)

demo:db<>fiddle

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