Как удалить запись, если следующая запись в таблице совпадает со значением в определенном поле - PullRequest
1 голос
/ 01 мая 2019

У меня есть таблица с повторяющимися значениями в поле cell_id (целое число). Я хочу удалить записи, в которых запись "n + 1" имеет то же значение, что и "n"

Таким образом, у меня не будет повторяющихся значений в смежных / смежных записях.

До

id | user_id | cell_id
25 | 5973    | 6051
26 | 5973    | 6051
27 | 5973    | 6051
28 | 5973    | 100
29 | 5973    | 256
30 | 5973    | 256
31 | 5973    | 6051
32 | 5973    | 6051

* После 1008 *

id | user_id | cell_id
25 | 5973    | 6051
28 | 5973    | 100
29 | 5973    | 256
31 | 5973    | 6051

Ответы [ 3 ]

0 голосов
/ 01 мая 2019
DELETE
FROM
    object a
        USING object b
WHERE
    a.id < b.id
    AND a.cell_id = b.cell_id;

Где вы бы заменили «объект» именем вашей таблицы.

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

Я бы просто использовал join, который выражается в delete через using:

delete from t
    using t t2
    where t2.cell_id = t.cell_id and t2.user_id = t.user_id and
          t2.id = t.id + 1;
0 голосов
/ 01 мая 2019

Вы можете использовать EXISTS, чтобы проверить, следует ли удалять строку:

delete from tablename t
where 
  exists (
  select 1 from tablename 
  where cell_id = t.cell_id and user_id = t.user_id and id < t.id
  )
  and
  t.cell_id = (select cell_id from tablename where id = 
  (select max(id) from tablename where id < t.id));

См. Демоверсию .
Результаты:

> id | user_id | cell_id
> -: | ------: | ------:
> 25 |    5973 |    6051
> 28 |    5973 |     100
> 29 |    5973 |     256
> 31 |    5973 |    6051
...