Как удалить последовательные повторяющиеся строки с уникальным идентификатором? - PullRequest
0 голосов
/ 14 января 2020

У меня есть следующая таблица для сбора информации о продуктах, которые меня интересуют.

CREATE TABLE priceinfo (
    date TEXT,
    title TEXT,
    sku INTEGER,
    price REAL,
    media TEXT,
    url TEXT
);

Как удалить записи из базы данных, в которой есть несколько последовательных строк повторяющихся данных с разными датами? Пример данных ниже. Я хочу сохранить записи, так как они меняются, а не записи, которые являются одинаковыми день за днем.

1 2019-12-10    Product1    123456789   25.99   Blu-ray https://www.example.com
2 2019-12-11    Product1    123456789   21.59   Blu-ray https://www.example.com
3 2019-12-12    Product1    123456789   21.59   Blu-ray https://www.example.com
4 2019-12-13    Product1    123456789   21.59   Blu-ray https://www.example.com
5 2019-12-14    Product1    123456789   20.89   Blu-ray https://www.example.com
6 2019-12-15    Product1    123456789   21.59   Blu-ray https://www.example.com

В этом примере я хотел бы, чтобы строки # 1, # 2, # 5 и # 6 сохранялись но № 3 и № 4 следует удалить, поскольку в этих двух строках нет никакой информации, кроме даты.

1 Ответ

0 голосов
/ 14 января 2020

Предполагая, что даты не имеют дубликатов, вы можете использовать lag():

select t.*
from (select t.*,
             lag(date) over (order by date) as prev_date,
             lag(date) over (partition by title, sku, price, media, url order by date) as prev_date2
      from t
     ) t
where prev_date is null or prev_date <> prev_date2;

РЕДАКТИРОВАТЬ:

Предполагая, что даты являются уникальными, вы можете использовать следующую логику c:

with todelete as (
      select t.*
      from (select t.*,
                   lag(date) over (order by date) as prev_date,
                   lag(date) over (partition by title, sku, price, media, url order by date) as prev_date2
            from t
           ) t
      where prev_date is null or prev_date <> prev_date2
     )
delete from t
    where t.date in (select cte.date from cte);
...