HQL有日志如下,请写出代码求得所有用户和活跃用户的总数及平均年龄。(活跃用户指连续两天都有访问记录的用户)日期 用户 年龄 数据集如下

该SQL查询用于统计用户活跃度,通过计算在特定时间内用户出现连续日期的数量,得出活跃用户总数及其平均年龄。同时,还给出了所有用户的总数量和平均年龄。查询中运用了rank()函数,date_sub()函数以及子查询来分析用户数据。
摘要由CSDN通过智能技术生成

select

    sum(user_total_count),

    sum(user_total_avg_age),

    sum(twice_count),

    sum(twice_count_avg_age)

from

(select

   0 user_total_count,

   0 user_total_avg_age,

   count(*) twice_count,

   cast(sum(age)/count(*) as decimal(10,2)) twice_count_avg_age

from

(

   select

   user_id,

   min(age) age

from

   (select

   user_id,

   min(age) age

from

   (

    select

   user_id,

   age,

   date_sub(dt,rk) flag

from

   (

    select

       dt,

       user_id,

       min(age) age,

       rank() over(partition by user_id order by dt) rk

    from

       user_age

    group by

       dt,user_id

    )t1

    )t2

group by

   user_id,flag

having

   count(*)>=2)t3

group by

   user_id

)t4

union all

select

   count(*) user_total_count,

   cast((sum(age)/count(*)) as decimal(10,1)),

   0 twice_count,

   0 twice_count_avg_age

from

   (

      select

         user_id,

         min(age) age

      from

         user_age

      group by

         user_id

   )t5)t6;

这道题就flag哪里有点绕,我说下我的思路:

select

   user_id,

   age,

   date_sub(dt,rk) flag

from

   t1

//rk是rank()函数返回的结果,rank排名是由低到高并且不跳数,就是值相等会出现相同的排名,日期相同rank值就会相同,所以只要是日期是相邻的,它们和rk的差值就会相同,然后对结果count(*),相同值的个数累加大于2,说明它们的日期是相邻的,为活跃用户。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值