Как скрыть дубликаты записей в postgres - PullRequest
0 голосов
/ 24 марта 2020

У нас есть таблица сообщений

╔════╤═════════╤═══════╤══════════════╤══════╗
║ id │ user_id │ title │ created_date │ rate ║
╠════╪═════════╪═══════╪══════════════╪══════╣
║ 1  │ 1       │ text  │ 10/12/2020   │ 5    ║
╟────┼─────────┼───────┼──────────────┼──────╢
║ 2  │ 1       │ text  │ 10/12/2020   │ 4    ║
╟────┼─────────┼───────┼──────────────┼──────╢
║ 3  │ 2       │ text  │ 10/12/2020   │ 3    ║
╟────┼─────────┼───────┼──────────────┼──────╢
║ 4  │ 2       │ text  │ 10/12/2020   │ 5    ║
╚════╧═════════╧═══════╧══════════════╧══════╝

Я хочу сгруппировать сообщения по дате создания и выбирать сообщения только с более низкой скоростью, поэтому результат должен быть

╔════╤═════════╤═══════╤══════════════╤══════╗
║ id │ user_id │ title │ created_date │ rate ║
╠════╪═════════╪═══════╪══════════════╪══════╣
║ 2  │ 1       │ text  │ 10/12/2020   │ 4    ║
╟────┼─────────┼───────┼──────────────┼──────╢
║ 3  │ 2       │ text  │ 10/12/2020   │ 3    ║
╚════╧═════════╧═══════╧══════════════╧══════╝

Сначала я попытался выбрать они с этим:

SELECT posts.*, MIN(rate) FROM posts GROUP BY created_date;

И получил ошибку: «ERROR column 'posts.id'» должен появиться в предложении GROUP BY или использоваться в статистической функции «

Я добавил после идентификатора GROUP BY

SELECT posts.*, MIN(rate) FROM posts GROUP BY id, created_date; 

, но это помогло только скрыть ошибку, и после этого sql я получил тот же результат, который показал в первой таблице

Есть ли другие способы сделать такие вещи?

1 Ответ

0 голосов
/ 24 марта 2020

Использование distinct on:

select distinct on (created_date) p.*
from posts p
order by created_date, rate asc;

Похоже, вам нужна одна строка на дату, та, которая имеет самый низкий показатель. distinct on выбирает одну строку для каждой комбинации клавиш в скобках. Какая строка основана на порядке в order by.

Если вы хотите дублировать, используйте rank() или подзапрос:

select p.*
from (select p.*,
             rank() over (partition by created_date order by rate) as seqnum
      from posts p
     ) p
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...