выберите все строки на основе max (случаи) и min (дата) - PullRequest
0 голосов
/ 06 августа 2020

У меня есть таблица covid, моя таблица выглядит примерно так:

location     | date     | new_cases | total_deaths | new_deaths
----------------------------------------------------------------
Afghanistan   2020-04-07    38             7             0
Afghanistan   2020-04-08    30             11            4
Afghanistan   2020-04-09    56             14            3
Afghanistan   2020-04-10    61             15            1
Afghanistan   2020-04-11    37             15            0
Afghanistan   2020-04-12    34             18            3   

В этом случае я хочу получить расположение строк на основе max (new_cases), это мой запрос:

select a.*
from covid a
    join (
    select location, max(new_cases) highest_case
    from covid 
    group by location 
    ) b 
on a.location = b.location
and a.new_cases = b.highest_case

но я нашел те же значения местоположения и max (case) с другим значением даты, это результат.

location     | date     | new_cases | total_deaths | new_deaths
----------------------------------------------------------------
Bhutan        2020-06-08    11           0              0
Bolivia       2020-07-28    2382         2647           64
Bonaire Sint  2020-04-02    2            0              0
Bonaire Sint  2020-07-15    2            0              0
Botswana      2020-07-24    164          1              0

Теперь, как я могу получить значения на основе min ( date), дайте мне совет, как это исправить, и результат должен быть таким:

 location     | date     | new_cases | total_deaths | new_deaths
----------------------------------------------------------------
Bhutan        2020-06-08    11           0              0
Bolivia       2020-07-28    2382         2647           64
Bonaire Sint  2020-04-02    2            0              0
Botswana      2020-07-24    164          1              0

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Используйте distinct on:

select distinct on (location) c.*
from covid c
order by location, new_cases desc;

Для минимальной даты используйте:

order by location, date asc;
0 голосов
/ 06 августа 2020

Вы можете использовать оконную функцию Max () для получения max_cases (в зависимости от местоположения), а затем нумерации строк (для получения минимальной даты):

select location,date,new_cases,total_deaths,new_deaths from
(
--get min date with max_cases
select row_number()over(partition by location order by date)n,date,
location,new_cases,total_deaths,new_deaths
 from
   (
     select location,date,max(new_cases)over(partition by 
     location)max_case,new_cases,total_deaths,new_deaths from covid  --get max_case
   ) X
  where new_cases=max_case   --fetch only max case
)Y where n=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...