|
Удаление дубликатов в таблице
|
|||
---|---|---|---|
#18+
Всем привет. Помогите плиз с решением следующей задачи. Есть таблица doc, в ней поля stat, nomer. Поле stat может принимать два значения, а поле nomer содержит соответственно номера (которые могут и повторяться). Вопрос: как удалить дубликаты записей колонки nomer оставив только последние из дублей. P.S. Мой запрос удаляет все кроме первой записи дубликатов --delete from doc --where nomer in ( --select nomer --from (select nomer,row_number() over (partition by nomer) as rn from doc) t --where t.rn>1) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2018, 19:29 |
|
Удаление дубликатов в таблице
|
|||
---|---|---|---|
#18+
wilwinВсем привет. Помогите плиз с решением следующей задачи. Есть таблица doc, в ней поля stat, nomer. Поле stat может принимать два значения, а поле nomer содержит соответственно номера (которые могут и повторяться). Вопрос: как удалить дубликаты записей колонки nomer оставив только последние из дублей. P.S. Мой запрос удаляет все кроме первой записи дубликатов --delete from doc --where nomer in ( --select nomer --from (select nomer,row_number() over (partition by nomer) as rn from doc) t --where t.rn>1) Таки сформулирую Вашу задачу более внятно. В таблице есть несколько строк. Для каждого из двух уникальных значений stat может быть несколько номеров nomer, поэтому нужно оставить для каждого stat одну строку с последним значением nomer. Вопрос - как это сделать? Ответ - никак. Потому что нет однозначного фактора, который определяет "последний" из дублей. Например, строки по порядку. stat nomer yes 10 no 11 yes 8 yes 7 no 12 Если последние по порядку yes-7 и no-12, то это один расклад, нужно оставить 4-ю и 5-ю строки, удалив все остальное. Если "последние" - это максимальные, тогда это yes-10 и no-12, нужно оставить 1-ю и 5-ю строки. А проблема у Вас, автор темы, в том, что строки из 2 столбцов лежат неупорядоченно и могут возвращаться в любом порядке . Перенумеруете - а реально запрос выведет строки так (и таки будет их нумеровать через row_number() ). То есть Вы решили оставить 4-ю и 5-ю, а запрос с командой delete будет работать над таким набором: yes 8 yes 7 yes 10 no 11 no 12 И удалите Вы совсем не то. Понятно, в чем подвох? P.S. Таки сформулируйте условие задачи алгоритмически верно и кошерно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2018, 20:10 |
|
Удаление дубликатов в таблице
|
|||
---|---|---|---|
#18+
Таблица выглядит так: stat | nomer | A 165 A 197 T 165 A 238 T 854 A 197 А 165 необходимо выбрать дубли колонки nomer, это записи 1 и 3 и 7 (165), 2 и 6 (197) и удалить соответственно 1 , 2, 3 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2018, 23:03 |
|
Удаление дубликатов в таблице
|
|||
---|---|---|---|
#18+
wilwinТаблица выглядит так: stat | nomer | A 165 A 197 T 165 A 238 T 854 A 197 А 165 необходимо выбрать дубли колонки nomer, это записи 1 и 3 и 7 (165), 2 и 6 (197) и удалить соответственно 1 , 2, 3 Таки ключевое тут "таблица выглядит ". То, что у Вас вернулось как A 165, а затем A 197, в другом запросе вернется как A 197, A 165. неявный номер строки только для этого запроса и этого порядка сортировки stat | nomer | 1 A 165 2 A 197 3 T 165 4 A 238 5 T 854 6 A 197 7 А 165 "это записи 1 и 3 и 7 (165)" - это сейчас они 1 и 3 и 7, а если будут 3 и 7 и 1, Вы захотите удалить первые две, которые сейчас 3 и 7 и оставить 1? Переформулирую. Вот нашли Вы лишние строки. Удаляете запросом delete from table where stat = "A" and nomer = 165. А запрос удалит все три строки, 1, 3 и 7. И совсем другой расклад, если бы был уникальный номер строки и запрос бы превратился в delete from table where stat = "A" and nomer = 165 and row_number in (1,3). И строка 7 осталась бы на месте. Или Вам все равно, какие 2 из 3-х строк (1-3-7) удалить? То есть нужно просто почистить таблицу? А Вы сделайте так - insert into table2 select tt.stat,tt.nomer from (select stat,nomer,row_number() over (partition by stat,nomer order by nomer desc) as row_number_in_tuple) tt where tt.row_number_in_tuple = 1 И таки затем truncate table, после чего insert into table () select * from table2 и затем drop table2. Как Вам такой вариант? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 17:59 |
|
Удаление дубликатов в таблице
|
|||
---|---|---|---|
#18+
Нет, какие строки удалять не все равно. Необходимо оставить последнюю из "пачки" дубликатов. Я добавил колонку авкоинкримента id, теперь каждая строка имеет свой уникальный номер. stat | nomer | id A | 569 | 1 A | 765 | 2 T | 138 | 3 A | 569 | 4 T | 366 | 5 A | 138 | 6 T | 555 | 7 T | 569 | 8 Только как указать удаляемые значения для каждой пачки дублей??? SELECT * FROM doc WHERE nomer IN (SELECT nomer FROM doc GROUP BY nomer HAVING Count(*) > 1) ORDER BY nomer , id desc ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 15:34 |
|
Удаление дубликатов в таблице
|
|||
---|---|---|---|
#18+
ctid ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 16:50 |
|
Удаление дубликатов в таблице
|
|||
---|---|---|---|
#18+
Вот написал запрос: delete from doc where nomer ( select nomer from (select id,stat,nomer, row_number() over (partition by nomer order by id desc ) as rnum from doc) t where t.rnum>1 ) но он все равно удаляет все дубликаты, ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 20:14 |
|
Удаление дубликатов в таблице
|
|||
---|---|---|---|
#18+
wilwinТаблица выглядит так: statnomerIDA1651A1972T1653A2384T8545A1976А1657 необходимо выбрать дубли колонки nomer, это записи 1 и 3 и 7 (165), 2 и 6 (197) и удалить соответственно 1 , 2, 3wilwinВот написал запрос: delete from doc where nomer ( select nomer from (select id,stat,nomer, row_number() over (partition by nomer order by id desc ) as rnum from doc) t where t.rnum>1 ) но он все равно удаляет все дубликаты, Вот так попробуйте: Код: sql 1. 2.
Для проверки: ссылка ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 08:20 |
|
|
start [/forum/topic.php?fid=53&msg=39684941&tid=1995636]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
126ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 237ms |
0 / 0 |