#postgresql #greatest-n-per-group
Вопрос:
created_at answer_id customer_id customer_name product email score
20/09/2021 1502 abc1 Alex watch alex@gmail.com 10
20/09/2021 1502 def2 Alex watch alex@gmail.com 10
22/08/2021 3405 ghi3 Ben phone ben@gmx.com 8
22/08/2021 3405 jkl4 Ben phone ben@gmx.com 8
12/09/2021 1439 abc1 Alex tablet alex@gmail.com 10
Я хотел бы ИСКЛЮЧИТЬ дублирующуюся информацию, если единственная разница заключается в идентификаторе пользователя.
Однако, если идентификатор ответа и created_at отличаются, то это больше не дублирующая информация.
Запрос, который я пробовал:
select * from (
select *,
rank() over ( partition by answer_id, customer_id order by created_at desc ) created_at_rank
from table ) rank_table
where rank = 1
Ожидаемый результат:
created_at answer_id customer_id customer_name product email score
20/09/2021 1502 abc1 Alex watch alex@gmail.com 10
22/08/2021 3405 ghi3 Ben phone ben@gmx.com 8
12/09/2021 1439 abc1 Alex tablet alex@gmail.com 10
Второй результат Alex включен, поскольку запись создается в другую дату создания с другим идентификатором ответа.
Комментарии:
1. «Я хотел бы выбрать только 1 идентификатор клиента из приведенной выше таблицы». тем не менее, ваши ожидаемые результаты показывают два, пожалуйста, уточните.
2. извините. Я имею в виду 1 идентификатор клиента на имя клиента.
Ответ №1:
Попробуйте выполнить следующий запрос.
Необходимо использовать ROW_NUMBER (), и в соответствии с вашими требованиями вы можете заказать по столбцам
select created_at,answer_id,customer_id,customer_name,product,email,score from (
select * from (
select ROW_NUMBER() OVER(PARTITION BY customer_name
ORDER BY customer_id) AS RowNum, created_at,answer_id,customer_id,customer_name,product,email,score
from table
) r where RowNum = 1
) report
Комментарии:
1. привет, запрос, похоже, не дает правильного результата, когда есть 3 строки с разными датами, например: abc1 имеет даты 19/05/2021, 25/08/2021, 20/09/2021. Поскольку это не дублирующая информация, я хотел бы сохранить все три. Я хочу исключить только то, есть ли идентичная информация, с той лишь разницей, что customer_id.
2. Хорошо. поэтому вам нужно удалить, где условие RowNum = 1, и сгруппировать по всем необходимым столбцам.
select created_at,answer_id,customer_id,customer_name,product,email,score from ( select * from ( select ROW_NUMBER() OVER(PARTITION BY customer_name ORDER BY customer_id) AS RowNum, created_at,answer_id,customer_id,customer_name,product,email,score from table ) r group by created_at,answer_id,customer_id,customer_name,product,email,score ) report
Приведенный выше запрос не был протестирован, только дан обзор того, как вы достигаете своего результата