Postgresql - Как определить последнюю запись комбинации из 2 столбцов (пример внутри) - PullRequest
0 голосов
/ 16 марта 2020

В PostgreSQL, если у меня есть такой вид записи:

|------------------|---------------------|------------------|
|  corona_country  |   corona_patient    | corona_suspected |
|------------------|---------------------|------------------|
|     Mexico       |        Teddy        |    2020-03-01    |
|------------------|---------------------|------------------|
|     Indonesia    |        Andy         |    2020-03-01    |
|------------------|---------------------|------------------|
|     Indonesia    |        Andy         |    2020-03-05    |
|------------------|---------------------|------------------|
|     China        |        Sarah        |    2020-03-04    |
|------------------|---------------------|------------------|
|     UK           |        Michael      |    2020-03-05    |
|------------------|---------------------|------------------|
|     Italy        |        Michael      |    2020-03-15    |
|------------------|---------------------|------------------|
|     Italy        |        Michael      |    2020-03-15    |
|------------------|---------------------|------------------|

Я хочу добавить дополнительный столбец (с помощью запроса Select), который определяет, имеет ли последняя комбинация corona_country и corona_patient дата (из колонки corona_suspected) среди собственных записей. Так это будет выглядеть так:

|------------------|---------------------|------------------|-----------|
|  corona_country  |   corona_patient    | corona_suspected |  LATEST?  |
|------------------|---------------------|------------------|-----------|
|     Mexico       |        Teddy        |    2020-03-01    |     Y     |
|------------------|---------------------|------------------|-----------|
|     Indonesia    |        Andy         |    2020-03-01    |     N     |
|------------------|---------------------|------------------|-----------|
|     Indonesia    |        Andy         |    2020-03-05    |     Y     |
|------------------|---------------------|------------------|-----------|
|     China        |        Sarah        |    2020-03-04    |     Y     |
|------------------|---------------------|------------------|-----------|
|     UK           |        Michael      |    2020-03-05    |     Y     |
|------------------|---------------------|------------------|-----------|
|     Italy        |        Michael      |    2020-03-13    |     N     |
|------------------|---------------------|------------------|-----------|
|     Italy        |        Michael      |    2020-03-15    |     Y     |
|------------------|---------------------|------------------|-----------|
|     Italy        |        Michael      |    2020-03-15    |     Y     |
|------------------|---------------------|------------------|-----------|

Как мне добиться этого с помощью sql запроса? Есть ли метод, который объединяет другую таблицу, которая записывает последние даты каждой комбинации corona_country и corona_patient?

Ответы [ 2 ]

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

Один вариант будет использовать MAX() OVER (PARTITION BY..) analyti c function

SELECT *,
       CASE 
       WHEN( MAX( corona_suspected ) OVER 
                ( PARTITION BY corona_country, corona_patient ) = corona_suspected )
       THEN 
         'Y'
       ELSE
         'N'
       END AS latest
  FROM t

ИЛИ альтернативно

Использовать DENSE_RANK() analyti c function

   CASE 
   WHEN(DENSE_RANK() OVER 
   (PARTITION BY corona_country, corona_patient ORDER BY corona_suspected DESC )=1)
   THEN 
     'Y'
   ELSE
     'N'
   END AS latest

чтобы вернуть результат с связями ( более чем одним последним значением для corona_suspected столбцов для каждой группы )

Demo

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

Использовать оконные функции:

select t.*,
       (rank() over (partition by corona_country, corona_patient order by corono_suspected desc) = 1
       ) as is_latest
from t;

Обратите внимание, что это создает логическое значение. Если вы хотите строку, используйте case:

select t.*,
       (case when rank() over (partition by corona_country, corona_patient order by corono_suspected desc) = 1
             then 'Y' else 'N'
        end) as is_latest
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...