MySQL查询指定日期区间内各邮编的最低温度对应日期
解决每个邮编对应最低温度及日期的SQL问题
原SQL的问题
你原来的语句错误在于:按postcode分组后,直接选择date字段时,数据库无法确定返回该分组下哪一条记录的日期(部分SQL模式会直接报错,允许的模式也可能返回随机日期),导致日期和最低温度不匹配。
两种高效解决方案
方案1:窗口函数(推荐)
利用ROW_NUMBER()窗口函数给每个邮编的记录按温度升序编号,取编号为1的记录就是最低温度对应的那条:
SELECT postcode, temperature, `date` FROM ( SELECT postcode, temperature, `date`, ROW_NUMBER() OVER (PARTITION BY postcode ORDER BY temperature ASC) AS rn FROM temperatures WHERE `date` BETWEEN '2022-02-01' AND '2022-02-02' ) t WHERE rn = 1;
如果同一邮编在日期区间内有多个相同的最低温度,想要保留所有对应日期,把ROW_NUMBER()换成RANK()即可。
方案2:子查询关联
先计算每个邮编的最低温度,再关联原表找到对应日期:
SELECT t.postcode, t.temperature, t.`date` FROM temperatures t JOIN ( SELECT postcode, MIN(temperature) AS min_temp FROM temperatures WHERE `date` BETWEEN '2022-02-01' AND '2022-02-02' GROUP BY postcode ) m ON t.postcode = m.postcode AND t.temperature = m.min_temp WHERE t.`date` BETWEEN '2022-02-01' AND '2022-02-02';
关于游标的疑问
完全不需要用游标,游标适合复杂的逐行逻辑处理,这类聚合关联场景用标准SQL写法更简洁高效,性能也更好。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

