sql - 滚动每日不同计数

标签 sql oracle aggregate-functions

我们有一个包含以下列的表格:

SESSION_ID      USER_ID          CONNECT_TS
--------------  ---------------  ---------------
1               99               2013-01-01 2:23:33
2               101              2013-01-01 2:23:55
3               104              2013-01-01 2:24:41
4               101              2013-01-01 2:24:43
5               233              2013-01-01 2:25:01

我们需要获取每天的不同用户数“活跃用户”的数量,“活跃用户”定义为在过去 45 天内使用过该应用程序的用户。这是我们的想法,但我觉得必须有更好的方法:

select trunc(a.connect_ts)
, count(distinct a.user_id) daily_users
, count(distinct b.user_id) active_users
from sessions a
  join sessions b
    on (b.connect_ts between trunc(a.connect_ts) - 45 and trunc(a.connect_ts))
where a.connect_ts between '01-jan-13' and '12-jun-13'
  and b.connect_ts between '01-nov-12' and '12-jun-13'
group by trunc(a.connect_ts);

我们查看了窗口函数,但它似乎不支持不同的计数。我们还考虑过先将聚合加载到临时表中,但是不同的计数再次将其排除在外。有没有更好的方法来做到这一点?

最佳答案

要做的第一件事是生成您感兴趣的日子的列表:

select (trunc(sysdate, 'yyyy') -1) + level as ts_day
from dual
connect by level <= to_number( to_char(sysdate, 'DDD' ) )

这将生成一个从今年 1 月 1 日到今天的日期表。将您的表加入此子查询。使用交叉联接可能不是特别有效,具体取决于范围内的数据量。因此,请将此视为概念验证并根据需要进行调整。

with days as
 ( select (trunc(sysdate, 'yyyy') -1) + level as ts_day
   from dual
   connect by level <= to_number( to_char(sysdate, 'DDD' ) ) )
select days.ts_day
       , sum ( case when trunc(connect_ts) = ts_day then 1 else 0 end ) as daily_users
       , sum ( case when trunc(connect_ts) between ts_day - 45 and ts_day then 1 else 0 end ) as active_users
from days
     cross join sessions  
where connect_ts between trunc(sysdate, 'yyyy') - 45 and sysdate
group by ts_day
order by ts_day
/

关于sql - 滚动每日不同计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17099743/

相关文章:

mysql - 如何修复此错误并从多个表中进行选择?

sql - nosql 是什么意思?有人可以用简单的话向我解释一下吗?

SQL DATEDIFF 不工作?

MYSQL在group by中有共同的记录

sql - PostgreSQL 不同的行与一列中的不同值的计数连接

Mysql全文索引搜索返回奇怪的结果

python - 通过连接到 Oracle DB 使用 Python Web 应用程序绘制图表

java - 老掉牙的 ORA-12705 : Cannot access NLS data files or invalid environment specified and java Locale. setDefault()

sql - 长期使用 Oracle 的用户切换到 MySQL,有什么需要注意的问题吗?

sql - 使用窗口函数计算每个事件行在给定间隔内事件的先前发生次数