выберите только 1 строку на идентификатор клиента, если дата совпадает, используя ранг (дублирующая информация).

#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 Приведенный выше запрос не был протестирован, только дан обзор того, как вы достигаете своего результата