ToB企服应用市场:ToB评测及商务社交产业平台

标题: sql 连续活跃天数 [打印本页]

作者: 徐锦洪    时间: 2023-4-13 04:25
标题: sql 连续活跃天数
1. 背景

已知数据集为:

目的:
计算每个uid的连续活跃天数,并且每一段活跃期内的开始时间和结束时间
2. 步骤

第一步:处理数据集
处理数据集,使其满足每个uid每个日期只有一条数据。
第二步:以uid为主键,按照日期进行排序,计算row_number.
  1. SELECT  uid
  2.           ,`征信查询日期`
  3.           ,ROW_NUMBER() OVER(PARTITION BY uid ORDER BY `征信查询日期` ASC) AS `rn`
  4.           ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` ASC) `fir`
  5.           ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` desc) `las`
  6. FROM   input
复制代码

两个关键点:
  1. select *,DATE_SUB(`征信查询日期`,`rn`) as `关键列` from (SELECT  uid
  2.           ,`征信查询日期`
  3.           ,ROW_NUMBER() OVER(PARTITION BY uid ORDER BY `征信查询日期` ASC) AS `rn`
  4.           ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` ASC) `fir`
  5.           ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` desc) `las`
  6. FROM   input)
复制代码

第三步:以uid和关键列作为主键。
  1. select uid, `关键列`,count(*) as `连续活跃天数`, min(`征信查询日期`) as `活跃开始时间`, max(`征信查询日期`) as `活跃结束时间` from (select *, DATE_SUB(`征信查询日期`,`rn`) as `关键列` from (SELECT  uid
  2.           ,`征信查询日期`
  3.           ,ROW_NUMBER() OVER(PARTITION BY uid ORDER BY `征信查询日期` ASC) AS `rn`
  4.           ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` ASC) `fir`
  5.           ,first_value(`征信查询日期`)over(PARTITION BY uid ORDER BY `征信查询日期` desc) `las`
  6. FROM   input  ) )group by uid, `关键列`
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4