Найти строки с одинаковыми значениями даты - PullRequest
0 голосов
/ 13 мая 2019

Я хочу найти клиентов, где, например, система по ошибке зарегистрировала дубликаты заказа.

Это довольно просто, если 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 / ж / m6PhgReSQbVWVZhqe8n4mi / 0

В настоящее время только 104 заказа клиента считаются дубликатами, поскольку его reg_date идентична, я хочу также учитывать заказы 1,2 и 4,5, так как разница составляет всего 1 секунду

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

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() .Это позволяет взглянуть на предыдущую запись.С помощью этого значения вы можете делать различий и фильтровать записи, где время различий больше одной секунды.

0 голосов
/ 13 мая 2019

Попробуйте следующий скрипт.Это вернет вам дневные / клиентские дубликаты.

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
...