2016-06-15 2 views
0

У меня есть набор данных, какPostgresql выбрать дубликат столбца на другой колонке

ID STATUS SOURCE 
1 new data1 
1 old data2 
2 old data1 
2 new data2 

, и я хочу, чтобы иметь возможность выбрать те дубликаты ID в колонке STATUS и сохранить SOURCE, окончательный список будет:

ID STATUS SOURCE 
1 new data1 
2 new data2 

я могу сделать список дубликатов ID что-то вроде:

select id, status, source 
from data 
where id in (
select id 
from data 
group by id 
having (count(*) > 1) 

то я не могу найти способ фильтрации по статусу для удаления дубликатов.

Спасибо.

+0

Итак, всякий раз, когда есть два или более дублирующих идентификатора, вы хотите сохранить один с 'status = 'new''? – dhke

+0

да, а остальные данные в этой строке –

+0

Если вы хотите полностью избавиться от дубликатов, вы можете «УДАЛИТЬ ОТ данных WHERE status =« old ». Если вы хотите только выбрать, то вы можете просто добавить другое условие: ... WHERE status = 'new' AND ... '. Это кажется слишком очевидным, хотя ... Я что-то упускаю? – Raffael

ответ

1

Вы можете использовать функцию Postgresql DISTINCT ON в сочетании с пунктом ORDER BY.

SELECT DISTINCT ON (id) 
     id, 
     status, 
     source 
FROM data 
ORDER BY id, status 

Вот aequivalent запрос, который не использует Postgres специфические особенности:

SELECT id, 
     status, 
     source 
FROM (SELECT id, 
       status, 
       source, 
       row_number() OVER (PARTITION BY id ORDER BY status) AS n 
     FROM data) AS sub 
WHERE sub.n = 1 

Предложение ORDER BY чувствует немного неуклюжий с этим набором данных (в обоих вариантах запроса), поскольку он использует алфавитный порядок чтобы выразить семантическое упорядочение «new новее, чем old». Заказ будет более естественным, если бы мы использовали столбец времени created_at (или аналогичный) вместо столбца status.

Смежные вопросы