篮之新喜 发表于 2023-4-13 04:25:29

sql 连续活跃天数

1. 背景

已知数据集为:
https://img2023.cnblogs.com/blog/2511413/202304/2511413-20230412164847357-1587134933.png
目的:
计算每个uid的连续活跃天数,并且每一段活跃期内的开始时间和结束时间
2. 步骤

第一步:处理数据集
处理数据集,使其满足每个uid每个日期只有一条数据。
第二步:以uid为主键,按照日期进行排序,计算row_number.
SELECTuid
          ,`征信查询日期`
          ,ROW_NUMBER() OVER(PARTITION BY uid ORDER BY `征信查询日期` ASC) AS `rn`
          ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` ASC) `fir`
          ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` desc) `las`
FROM   inputhttps://img2023.cnblogs.com/blog/2511413/202304/2511413-20230412170757295-2101619183.png
两个关键点:

[*]序号rn可以看做一直活跃的情况下,活跃日期最大值和活跃日期最小值之间的天数差。那么,日期最大值与日期最小值之差如果不等于序号,就表明中间有不连续。
[*]用'征信查询日期' - rn 可以计算一列"关键列",连续时间段内,它的关键列值是一样的
select *,DATE_SUB(`征信查询日期`,`rn`) as `关键列` from (SELECTuid
          ,`征信查询日期`
          ,ROW_NUMBER() OVER(PARTITION BY uid ORDER BY `征信查询日期` ASC) AS `rn`
          ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` ASC) `fir`
          ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` desc) `las`
FROM   input)https://img2023.cnblogs.com/blog/2511413/202304/2511413-20230412171409418-674587861.png
第三步:以uid和关键列作为主键。
select uid, `关键列`,count(*) as `连续活跃天数`, min(`征信查询日期`) as `活跃开始时间`, max(`征信查询日期`) as `活跃结束时间` from (select *, DATE_SUB(`征信查询日期`,`rn`) as `关键列` from (SELECTuid
          ,`征信查询日期`
          ,ROW_NUMBER() OVER(PARTITION BY uid ORDER BY `征信查询日期` ASC) AS `rn`
          ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` ASC) `fir`
          ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` desc) `las`
FROM   input) )group by uid, `关键列`https://img2023.cnblogs.com/blog/2511413/202304/2511413-20230412171611919-1433691337.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: sql 连续活跃天数