SQL DISTINCT ИЗВЛЕКАЕТ ВСЕ ОСТАЛЬНЫЕ СТОЛБЦЫ ОДНОЙ И ТОЙ ЖЕ ЗАПИСИ

#sql #postgresql #distinct

Вопрос:

Я использую PostgreSQL

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

 ID | Phone        | link
1  | 3105637247   | https://link_for_id_1
2  | 3105637247   | https://link_for_id_2
3  | 3105637247   | https://link_for_id_3 
4  | 3153333651   | https://link_for_id_4
5  | 3153333651   | https://link_for_id_5
 

Цель состоит в том, чтобы использовать эти данные для отчетности перед отделом продаж. Но требование состоит в том, чтобы не было повторных телефонных номеров. В этом случае мой желаемый результат был бы:

 ID | Phone        | link
1  | 3105637247   | https://link_for_id_1
5  | 3153333651   | https://link_for_id_5
 

Для этой цели я использую этот запрос:

 SELECT DISTINCT Phone,
                max(ID), -- Here using aggregated functions to allow ID and link to visualize
                max(link) 
FROM MyTable
 

Но этот подход иногда дает мне ссылки, которые не соответствуют моему идентификатору:

 ID | Phone        | link
1  | 3105637247   | https://link_for_id_3
5  | 3153333651   | https://link_for_id_4
 

Есть ли способ получить уникальные телефоны при условии, что идентификатор и ссылка соответствуют одной и той же записи?

Комментарии:

1. Как вы узнаете, какая ссылка правильная?

2. Я имею в виду, какая правильная ссылка для 3105637247 и почему ?

3. Привет @LeandroBardelli, как вы можете видеть, последний символ ссылки совпадает с идентификатором. Таким образом, я знаю, каков правильный результат.

4. Я знаю, но почему вы «удаляете» 2 и 3? Легко можно сказать, что правильная ссылка-3.

5. Например: Почему 1 | 3105637247 | https://link_for_id_1 и нет 3 | 3105637247 | https://link_for_id_3

Ответ №1:

Вы можете использовать Postgresql DISTINCT ON :

 select distinct on (Phone) t.*
from Mytable t
order by Phone
 

Или сделать NOT EXISTS :

 select t.*
from Mytable t
where not exists (select 1 from Mytable t2
                  where t2.Phone = t1.Phone
                    and t2.id < t1.id)