订阅更新

各国 11 月的天气类型:先平均再分档

SQL 实战 123 题 · 第 89 题 简单 约 2 分钟读完

LeetCode 1294 · 聚合后 CASE 分档、日期范围

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

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 分组更稳。
刷题进度保存在当前浏览器