Выберите все строки, которые соответствуют самой ранней дате для определенного соответствующего столбца - PullRequest
0 голосов
/ 03 мая 2020

У меня есть postgres (11) база данных с таблицей, в которой перечислены места посещений людей и даты их посещения:

name | place |    date
-----+-------+-----------
  Al |     x | 2020-01-01
  Al |     y | 2020-01-01
  Al |     z | 2020-02-02
 Bob |     q | 2020-06-06 
 Bob |     q | 2020-07-07 
 Bob |     r | 2020-07-07 
 Sue |     z | 2020-07-07 
 Sue |     a | 2020-07-07
 Sue |     b | 2020-08-08

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

name | place |    date
-----+-------+-----------
  Al |     x | 2020-01-01
  Al |     y | 2020-01-01
 Bob |     q | 2020-06-06 
 Sue |     z | 2020-07-07 
 Sue |     a | 2020-07-07

Кто-нибудь может подсказать, как этого можно достичь?

1 Ответ

1 голос
/ 03 мая 2020

Предполагая, что у вас есть все строки в таблице visits, вы можете создать что-то вроде этого, сначала создав запрос, который выбирает первую дату, которую посетил каждый человек. Это легко сделать, используя:

SELECT name, MIN(date) AS date FROM visits GROUP BY name

Получив это, вы можете просто объединить результат с исходной таблицей. Тогда он будет использовать только те строки, которые имеют одинаковое имя и дату. Я решил использовать CTE, потому что за ним легче следовать:

WITH 
  first_day AS (SELECT name, MIN(date) AS date FROM visits GROUP BY name)
SELECT name, place, date
  FROM first_day JOIN visits USING (name, date);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...