Удалить дубликаты в запросе выбора на основе одного столбца - PullRequest
0 голосов
/ 29 марта 2019

Я хочу выбрать без дубликатов id s и сохранить строку '5d', а не '5e' в операторе выбора.

таблица

id | name
1  | a
2  | b
3  | c
5  | d
5  | e

Я пытался:

SELECT id, name 
FROM table t
INNER JOIN (SELECT DISTINCT id FROM table) t2 ON t.id = t2.id

Ответы [ 3 ]

4 голосов
/ 29 марта 2019

Для данного примера будет работать агрегация с использованием min().

SELECT id,
       min(name) name
       FROM table
       GROUP BY id;
1 голос
/ 29 марта 2019

Вы также можете использовать ROW_NUMBER():

SELECT id, name
FROM (
    SELECT id, name, ROW_NUMBER() OVER(PARTITION BY id ORDER BY name) rn 
    FROM mytable
) x
WHERE rn = 1

. При этом будет сохранена запись с наименьшим значением name (поэтому '5d' будет предшествовать '5e').С помощью этого метода вы также можете использовать критерии сортировки для другого столбца, который существует в том месте, где есть дубликаты (что не может выполнить агрегированный запрос с MIN()).Кроме того, запросы с использованием оконных функций обычно работают лучше, чем эквивалентный агрегированный запрос.

1 голос
/ 29 марта 2019

Если вы хотите сохранить строку с наименьшим именем, вы можете использовать not exists:

select t.* from tablename t
where not exists (
  select 1 from tablename
  where id = t.id and name < t.name
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...