SQL低版本连续多条记录合并,多条记录分组合并

步骤一

准备数据:temp_ combine_202208,三个字段,机构号,id号,日期

organ_noid_nodate
10013000120220131
10013000120220228
10013000120220331
10023000120220430
10023000120220531
10013000120220630
10013000120220731
10023000220220331
10023000220220430
10023000220220531
10023000220220630

要求:按照id号,机构号进行分组合并,并记录起始日期和结束日期。目前能查到用lag函数,但是我的sql中没有这个函数,因此采取下文的方法。

步骤二

分析数据:问题的关键是按照日期的连续性排序

1.采用ROW_NUMBER对数据进行编号

SELECT organ_no,id_no,date,ROW_NUMBER() OVER(PARTITION BY id_no,organ_no ORDER BY substr(date,1,6)) as group_number
from temp_combine_202208
order by organ_no,id_no,date

结果如下:

organ_noid_nodategroup_number
100130001202201311
100130001202202282
100130001202203313
100130001202206304
100130001202207315
100230001202204301
100230001202205312
100230002202203311
100230002202204302
100230002202205313
100230002202206304

2.关键处理:采取date减去group_number的方法即可得到分组数,然后就可以按连续性进行分组

SELECT organ_no,id_no,date,
substr(date,4,3)-ROW_NUMBER() OVER(PARTITION BY id_no,organ_no ORDER BY substr(date,1,6)) as group_number
from temp_combine_202208
order by id_no,date

结果如下:

organ_noid_nodategroup_number
10013000120220131200.0
10013000120220228200.0
10013000120220331200.0
10023000120220430203.0
10023000120220531203.0
10013000120220630202.0
10013000120220731202.0
10023000220220331202.0
10023000220220430202.0
10023000220220531202.0
10023000220220630202.0

步骤三

最后按照organ_no,id_no,group_number进行分组即可

select organ_no,id_no,group_number,min(date) as month_date_begin,max(date) as month_date_end
FROM
(SELECT organ_no,id_no,date,
substr(date,4,3)-ROW_NUMBER() OVER(PARTITION BY id_no,organ_no ORDER BY substr(date,1,6)) as group_number
from temp_combine_202208)a
group by 1,2,3
order by 2,4

最后结果:

organ_noid_nogroup_numbermonth_date_beginmonth_date_end
100130001200.02022013120220331
100230001203.02022043020220531
100130001202.02022063020220731
100230002202.02022033120220630
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值