如何用SQL获取指定日期所属组的前两组及日期范围
问题描述

- 需要确定
21-jan-2022所属的分组,再获取该分组之前的最后两个分组及其日期范围 - 示例:
21-Jan-22属于G4,需提取G2和G3的日期范围 - 尝试过cross join、分析函数、子查询,仍无法实现提取前两组的需求
解决方案
假设你的分组表名为date_groups,包含group_name(分组名)、start_date(开始日期)、end_date(结束日期)字段,可通过以下SQL实现需求:
WITH target_group AS ( -- 定位目标日期所属分组,并按日期给分组排序 SELECT group_name, ROW_NUMBER() OVER (ORDER BY start_date) AS group_rank FROM date_groups WHERE TO_DATE('21-jan-2022', 'DD-mon-YYYY') BETWEEN start_date AND end_date ), all_ranked_groups AS ( -- 给所有分组按日期排序生成排名 SELECT group_name, start_date, end_date, ROW_NUMBER() OVER (ORDER BY start_date) AS group_rank FROM date_groups ) -- 筛选目标分组排名减1、减2的两组数据 SELECT group_name, start_date, end_date FROM all_ranked_groups JOIN target_group ON all_ranked_groups.group_rank IN (target_group.group_rank - 1, target_group.group_rank - 2) ORDER BY all_ranked_groups.group_rank;
逻辑说明:
- 用
ROW_NUMBER()按开始日期给分组排序,确保分组的先后顺序符合时间逻辑 - 先找到目标日期所在分组的排名,再筛选出排名比它小1和小2的分组,即为目标分组之前的最后两个分组
- 如果分组是按
G1、G2这类命名顺序排序,把ORDER BY start_date替换为ORDER BY group_name即可,可根据实际表结构调整
内容的提问来源于stack exchange,提问作者Rajarshi Maity
相关产品推荐
相关产品推荐

