SQL实现:按创建时间筛选各预报时间对应的最新预报记录
天气预报表取最新预报记录SQL实现方案
方案1:窗口函数实现(推荐)
适用于支持窗口函数的主流数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等),性能更优写法简洁:
WITH ranked_forecasts AS ( SELECT id, forecast_timestamp, created_timestamp, -- 按预报时间分组,分组内按创建时间倒序排序 ROW_NUMBER() OVER (PARTITION BY forecast_timestamp ORDER BY created_timestamp DESC) AS rn FROM forecasts ) -- 取每个分组排序第一的最新记录 SELECT id, forecast_timestamp, created_timestamp FROM ranked_forecasts WHERE rn = 1;
注意:如果同一预报时间下存在多条创建时间完全相同的记录,需要全部返回时将
ROW_NUMBER()替换为RANK()即可。
方案2:关联子查询实现(兼容低版本数据库)
适用于不支持窗口函数的低版本数据库(如MySQL 5.x):
SELECT f.id, f.forecast_timestamp, f.created_timestamp FROM forecasts f -- 先查询每个预报时间对应的最大创建时间 INNER JOIN ( SELECT forecast_timestamp, MAX(created_timestamp) AS max_created FROM forecasts GROUP BY forecast_timestamp ) t ON f.forecast_timestamp = t.forecast_timestamp AND f.created_timestamp = t.max_created;
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

