#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)