如何查询每年中指定数值范围首次出现的最早日期
解决方案
要获取每年中VALUE处于-100到100之间的最早RECDATE,你可以使用窗口分区函数实现按年份分组处理的需求,这正是你提到的分区查询方式。
核心查询语句
SELECT YEAR, RECDATE, VALUE FROM ( SELECT YEAR, RECDATE, VALUE, -- 按年份分区,每个分区内按日期升序排序生成行号 ROW_NUMBER() OVER (PARTITION BY YEAR ORDER BY RECDATE ASC) AS row_num FROM your_table_name -- 替换为你的实际表名 WHERE VALUE BETWEEN -100 AND 100 ) ranked_data WHERE row_num = 1 -- 筛选每个年份的第一条(最早日期)记录 ORDER BY YEAR;
语句说明
- 数据过滤:内层查询先通过
WHERE VALUE BETWEEN -100 AND 100筛选出符合数值范围的记录。 - 分区排序:
ROW_NUMBER() OVER (PARTITION BY YEAR ORDER BY RECDATE ASC)将数据按YEAR拆分为独立分区,每个分区内按RECDATE从小到大排序,为每条记录生成唯一行号——每个年份中最早的日期会被标记为row_num = 1。 - 结果筛选:外层查询仅保留
row_num = 1的记录,即每个年份符合条件的最早日期数据。
扩展:处理同一年份多记录的情况
如果同一年份的同一天存在多条符合条件的记录,你可以用RANK()替代ROW_NUMBER(),这样会保留所有同一天的匹配记录:
SELECT YEAR, RECDATE, VALUE FROM ( SELECT YEAR, RECDATE, VALUE, RANK() OVER (PARTITION BY YEAR ORDER BY RECDATE ASC) AS rank_num FROM your_table_name WHERE VALUE BETWEEN -100 AND 100 ) ranked_data WHERE rank_num = 1 ORDER BY YEAR;
内容的提问来源于stack exchange,提问作者James Schrumpf
相关产品推荐
相关产品推荐

