sql中的计数状态聚合

lf3rwulv  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(306)

我正在处理一些包含播放状态的日志数据 play 以及 end . 在游戏中,客户将报告 play 多次但是什么时候 end 看来,这意味着游戏结束了,就像

user_id  status  timestamp
   a      play    xxx
   a      play    xxx
   a      play    xxx
   a      end     xxx
   b      play    xxx
   b      end     xxx
   c      play    xxx
   c      play    xxx
   c      end     xxx
   a      play    xxx
   a      play    xxx
   a      end     xxx
   a      play    xxx
   a      end     xxx

现在,我可以用 row_number() 计算 user_id 游戏数超过2 play 状态如下:


# I realize this is a wrong query...

select count(distinct user_id) as cnt_uid
    (select  
        user_id,status,timestamp, 
        row_number() over (partition by user_id, status, order by timestamp) as rn
    from tableA) a
    where rn>=2

但是如果我需要计算超过2的游戏数 play 状态(例如: user A 有2场比赛,超过2场 play 地位和地位 user C 有1),怎么做?感谢您的帮助。

  • 附言:预期的结果只是一个游戏的数量超过2 play 对于上述数据,结果为 3 .
mpbci0fu

mpbci0fu1#

您可以使用 status = 'end' . 然后一次又一次地聚合:

select user_id, count(*) as games_with_2+_plays
from (select user_id, grp, count(*) as num_plays
      from (select t.*,
                   sum(case when status = 'end' then 1 else 0 end) over (partition by user_id order by timestamp) as grp
            from t
           ) t
      where status = 'play'
      group by user_id, grp
     )
where num_plays >= 2
group by user_id;

相关问题