У меня есть таблица продуктов со следующей схемой:
id createdOn, updatedOn, stock, status
createdOn
& updatedOn
являются TimeStamp
.
createdOn
- поле для паратирования.
Скажите, что у меня есть данные:
id createdOn, updatedOn, stock, status
1 2018-09-14 14:14:24.305676 2018-09-14 14:14:24.305676 10 5
2 2018-09-14 14:14:24.305676 2018-09-14 14:14:24.305676 5 12
3 2018-09-14 14:14:24.305676 2018-09-14 14:14:24.305676 10 5
У меня есть ETL
, который добавляет новые строки в эту таблицу. когда ETL закончен, у меня может возникнуть ситуация, когда один и тот же id
имеет более 1 строки.
Например:
id createdOn, updatedOn, stock, status
1 2018-09-14 14:14:24.305676 2018-09-14 14:14:24.305676 10 5
2 2018-09-14 14:14:24.305676 2018-09-14 14:14:24.305676 5 12
3 2018-09-14 14:14:24.305676 2018-09-14 14:14:24.305676 10 5
1 2018-09-14 14:14:24.305676 2018-09-14 14:14:24.305676 10 5
3 2018-09-14 14:14:24.305676 2018-09-15 10:00:00.000000 7 5
Я хочу получить запрос, который будет выполняться по таблице, и убедиться, что у каждого идентификатора есть только 1 строка - строка с MAX(updatedOn)
должна остаться. Для MAX(updatedOn)
для идентификатора может быть более 1 строки - в этом случае это гарантирует, что они идентичны, потому что, если бы они не были такими, поле updatedOn
было бы изменено.
После выполнения запроса таблица будет выглядеть так:
id createdOn, updatedOn, stock, status
2 2018-09-14 14:14:24.305676 2018-09-14 14:14:24.305676 5 12
1 2018-09-14 14:14:24.305676 2018-09-14 14:14:24.305676 10 5
3 2018-09-14 14:14:24.305676 2018-09-15 10:00:00.000000 7 5
Как мне написать запрос, который эффективно выполняет это?
Я знаю, это должно быть что-то вроде:
DELETE FROM products
WHERE id NOT IN
(
SELECT MAX(id)
FROM products
GROUP BY id
)
Однако это не сработает ... У меня нет поля автоинкремента, чтобы различать строки.
Как я могу решить это?