我正在尝试对sqlzoo(https://sqlzoo.net/wiki/Window_LAG#LAG_using_a_JOIN)中的这个问题集做第8个问题。
问题是“对于每一个在一天内至少有1000个新病例的国家,显示新病例峰值的日期。”
下表给出了各国每天的新冠肺炎病例、死亡人数和康复人数,如下所示:
+-------------+-------------------------------+-----------+--------+-----------+
| 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 |
4条答案
按热度按时间y0u0uwnf1#
您可以通过比较随后几天的
confirmed
来计算 new 案例的数量;为此,lag()
派上了用场:这假设每个国家/地区每天有一笔记录。然后,您可以以此为依据对每个国家/地区的记录进行排名,并筛选每个国家/地区排名靠前的日期:
cwtwac6a2#
它看起来并不好,但它适用于MySQL。由于某些原因,其他答案没有通过。
but5z9lq3#
使用
RANK() OVER (PARTITION BY name ORDER BY peak) AS rank
对每个国家每天的新病例数进行排名,然后选择rank = 1
在外部查询中的病例数以找到峰值。看起来输出的顺序需要调整才能完全符合答案,但我认为这是可行的。
wkyowqbh4#