Mysql - Как получить максимальную дату, когда количество дел достигло пика - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь выполнить №8 по этой задаче, установленной из sqlzoo (https://sqlzoo.net/wiki/Window_LAG#LAG_using_a_JOIN).

Вопрос: «Для каждой страны, в которой было по крайней мере 1000 новых случаев в за один день, покажите дату пика числа новых случаев ".

В таблице covid указано количество случаев заболевания, смертей и выздоровлений за день по странам:

+-------------+-------------------------------+-----------+--------+-----------+
|    Name     |              whn              | confirmed | deaths | recovered |
+-------------+-------------------------------+-----------+--------+-----------+
| Afghanistan | Sun, 01 Mar 2020 00:00:00 GMT |         1 |      0 |         0 |
| Albania     | Sun, 01 Mar 2020 00:00:00 GMT |         0 |      0 |         0 |
| Algeria     | Sun, 01 Mar 2020 00:00:00 GMT |         1 |      0 |         0 |
+-------------+-------------------------------+-----------+--------+-----------+

В настоящее время у меня есть этот код:

SELECT c.name, DATE_FORMAT(c.whn,'%Y-%m-%d') as this, d.peak
from ( select tw.name, max(tw.confirmed-lw.confirmed) as peak
FROM covid tw LEFT JOIN covid lw ON 
  DATE_ADD(lw.whn, INTERVAL 1 DAY) = tw.whn
   AND tw.name=lw.name
where tw.confirmed-lw.confirmed > 1000
group by tw.name) d
join covid as c
on d.name = c.name
group by name

, который дает мне каждую страну, дату и максимальное количество обращений. Однако дата показывает первый день для каждой страны, когда количество случаев превышает 1000. Как мне узнать дату, когда есть пиковое количество случаев?

|  Name   |    this    | peak |
|---------|------------|------|
| Austria | 2020-03-26 | 1321 |
| Belarus | 2020-04-20 | 1485 |
| Belgium | 2020-03-26 | 2454 |

Ответы [ 2 ]

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

Вы можете подсчитать количество новых случаев, сравнив confirmed за последующие дни; для этого пригодится lag():

select 
    t.*,
    confirmed - lag(confirmed, 1, 0) over(partition by name order by whn) new_cases
from mytable t

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

select *
from (
    select 
        t*, 
        rank() over(partition by name order by new_cases desc) rn
    from (
        select 
            t.*,
            confirmed - lag(confirmed, 1, 0) over(partition by name order by whn) new_cases
        from mytable t
    ) t
    where new_cases > 1000
) t
where rn = 1
0 голосов
/ 28 августа 2020

Используйте RANK() OVER (PARTITION BY name ORDER BY peak) AS rank, чтобы ранжировать количество новых случаев ежедневно в каждой стране, а затем выберите те, которые rank = 1 во внешнем запросе, чтобы найти пик. Вот мой полный запрос:

SELECT name, date, peak FROM
 (SELECT name, date, peak, RANK() OVER (PARTITION BY name ORDER BY peak DESC) as rank
  FROM 
   (SELECT name, DATE_FORMAT(whn,'%Y-%m-%d') AS date, 
    confirmed - (LAG(confirmed, 1) OVER (PARTITION BY name ORDER BY whn)) AS peak 
    FROM 
     covid)  
  TAB WHERE peak >= 1000)
TAB WHERE rank = 1
ORDER BY date

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

...