首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想使用sql统计在线人数与开始时间和结束时间

我想使用sql统计在线人数与开始时间和结束时间
EN

Stack Overflow用户
提问于 2020-03-08 17:49:30
回答 2查看 28关注 0票数 1

我想使用sql的开始时间和结束时间在presto上统计在线人数。

我的数据如下:

代码语言:javascript
复制
userid  begintime   endtime
023150000030040 2020-03-05 12:50:46 2020-03-05 12:50:49
023150004186637 2020-03-05 10:31:19 2020-03-05 10:31:24
023150000788581 2020-03-05 00:59:01 2020-03-05 01:02:00
023150004411606 2020-03-05 19:55:42 2020-03-05 20:02:51
023150004066308 2020-03-05 18:48:03 2020-03-05 18:58:03
023150002033547 2020-03-05 12:39:24 2020-03-05 12:42:21
023150000030040 2020-03-05 13:26:02 2020-03-05 13:26:04
023150003690798 2020-03-05 02:04:50 2020-03-05 02:14:50
023150000030040 2020-03-05 13:57:10 2020-03-05 13:57:12
023150004460558 2020-03-05 16:44:48 2020-03-05 16:47:58

我想每小时统计一次在线人数。现在我有了一种愚蠢的数数方法。我的sql如下:

代码语言:javascript
复制
select '01' as hour,COUNT(distinct T.userid)
from datamart_ott_b2b_jsydcp.f_tplay t where t.topicdate  ='2020-03-05'   
and t.begintime < date_parse('2020-03-05 01', '%Y-%m-%d %h')
and t.endtime > date_parse('2020-03-05 00', '%Y-%m-%d %h')

union all 

select  '02' as hour,COUNT(distinct T.userid)
from datamart_ott_b2b_jsydcp.f_tplay t where t.topicdate  ='2020-03-05'   
and t.begintime < date_parse('2020-03-05 02', '%Y-%m-%d %h')
and t.endtime > date_parse('2020-03-05 01', '%Y-%m-%d %h')

.......

有没有更简单的方法来做这件事?THX

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-08 20:09:07

在Prestodb中,您可以生成一个包含整数值的数组,然后对它们进行解嵌套以获得小时数。然后使用joins和group by执行所需的计算:

代码语言:javascript
复制
select hh.hh as hour, cont(distinct t.userid)
from (select sequence(0, 23) hhs
     ) h cross join
     unnest(h.hhs)  as hh(hh) left join
     datamart_ott_b2b_jsydcp.f_tplay t
     on hour(begintime) <= hh.hh and
        hour(enddtime) >= hh.hh
where t.topicdate  = '2020-03-05'  
group by hh.hh
order by hh.hh;
票数 1
EN

Stack Overflow用户

发布于 2020-03-08 18:01:16

使用日历表方法,我们可以在小时和日期都匹配的条件下,将包含所有24小时的表左连接到当前表。然后,我们可以按小时汇总,并计算不同用户的数量,以生成您想要的输出。

代码语言:javascript
复制
WITH hours AS (
    SELECT 0 AS hour UNION ALL
    SELECT 1 UNION ALL
    SELECT 2 UNION ALL
    ...
    SELECT 23
)

SELECT
    h.hour,
    COUNT(DISTINCT t.userid) AS user_cnt
FROM hours h
LEFT JOIN datamart_ott_b2b_jsydcp.f_tplay t
    ON h.hour = DATE_TRUNC('hour', t.topicdate) AND
       t.topicdate = '2020-03-05'
GROUP BY
    h.hour
ORDER BY
    h.hour;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60586271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档