各国 11 月的天气类型:先平均再分档
LeetCode 1294 · 聚合后 CASE 分档、日期范围
面试怎么回答
JOIN 后过滤 11 月的日期区间,按国家分组,CASE WHEN AVG(weather_state) <= 15 THEN 'Cold' WHEN AVG(weather_state) >= 25 THEN 'Hot' ELSE 'Warm' END。日期条件我会写成区间而不是对列做 DATE_FORMAT,方便走索引。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
国家表和天气表(每个国家每天一条天气数值)。根据 2019 年 11 月的平均天气数值给每个国家归类:≤ 15 为 Cold,≥ 25 为 Hot,其余为 Warm。11 月没有数据的国家不输出。
表结构
- Countries:country_id(主键)、country_name
- Weather:country_id、weather_state、day;(country_id, day) 为主键
思路
先限定 11 月,按国家分组求平均,再用 CASE 对平均值分档。CASE 里可以直接写聚合函数。
参考解法
select country_name,( case when avg(weather_state)<=15 then 'Cold'
when avg(weather_state)>=25 then 'Hot'
else 'Warm' end ) weather_type
from Countries c join Weather w on c.country_id = w.country_id
where date_format(day,"%Y-%m")='2019-11'
group by country_name
易错点
DATE_FORMAT(day, '%Y-%m') = '2019-11'对列套函数,无法利用索引;写成day BETWEEN '2019-11-01' AND '2019-11-30'更好。- 按 country_name 分组时国家重名会合并,按 country_id 分组更稳。