Короткий ответ
Нахожу дубликаты через GROUP BY по ключевым полям с HAVING count(*) > 1, затем считаю выручку по уникальным order_id через DISTINCT или дедуплицированную подвыборку.
Как это работает подробнее
дубль строки означает, что один и тот же заказ посчитан несколько раз, что завышает сумму; нужно сначала определить, что считается «одной и той же записью» (весь набор полей или конкретный ключ order_id).
Пример кода
Пример SQL
-- найти дубликаты по order_id
SELECT order_id, count(*) AS cnt
FROM orders
GROUP BY order_id
HAVING count(*) > 1;
-- корректная сумма выручки без дублей
SELECT sum(amount) AS revenue
FROM (
SELECT DISTINCT order_id, amount
FROM orders
) t;Что использовать на практике
- Порядок действий. сначала проверяю, одинаковы ли все поля у предполагаемых дублей (полный дубль) или различаются некритичные поля (например, updated_at) — тогда нужна дедупликация по order_id с выбором последней версии записи. Уточняю у владельца данных, возможно ли у одного order_id законно несколько строк (например, позиции заказа).
Подводные камни
- Частые ошибки. удалять дубли через DISTINCT * не проверив, что совпадают все поля, включая метки времени; путать «дубликат записи» с «несколько строк одного заказа по дизайну» (например, line items); не логировать, сколько строк было удалено, что мешает воспроизводимости.