如何在 Oracle SQL 中滚动计算每个用户的天数?

Posted

技术标签:

【中文标题】如何在 Oracle SQL 中滚动计算每个用户的天数?【英文标题】:How to count no of days per user on a rolling basis in Oracle SQL? 【发布时间】:2020-10-21 01:27:17 【问题描述】:

继之前的question 之后,我在其中有一个名为 orders 的表格,其中包含有关下订单的时间和下订单的人的信息。

   order_timestamp     user_id  
 -------------------- --------- 
  1-JUN-20 02.56.12        123  
  3-JUN-20 12.01.01        533  
  23-JUN-20 08.42.18       123  
  12-JUN-20 02.53.59       238  
  19-JUN-20 02.33.72        34  

我想计算用户在过去 10 天内下单的天数的每日滚动计数。 例如,从 6 月 20 日开始的最后 10 天,用户 34 在其中的 5 天下了订单。然后在从 6 月 21 日开始的最后 10 天内,用户 34 在其中的 6 天下订单

最后表格应该是这样的:


    date      user_id   no_of_days  
 ----------- --------- ------------ 
  20-JUN-20        34            5  
  20-JUN-20       123           10  
  20-JUN-20       533            2  
  20-JUN-20       238            3  
  21-JUN-20        34            6  
  21-JUN-20       123           10  

如何为这种分析编写查询? 如果我的问题不清楚/需要更多信息,请告诉我。 感谢您的进步。

【问题讨论】:

【参考方案1】:

您可以为此使用窗口函数。从每天为每个用户获取一行开始。然后使用滚动总和:

select day, user_id,
       count(*) over (partition by user_id range between interval '10' day preceding and current row)
from (select distinct trunc(order_timestamp) as day, user_id
      from t
     ) t

【讨论】:

【参考方案2】:

假设用户一天最多下一个订单,您可以使用如下窗口函数:

select 
    t.*,
    count(*) over(partition by user_id order by trunc(order_timestamp) range 10 preceding) no_of_days
from mytable t

否则,您可以先获得每天不同的订单:

select 
    order_day,
    user_id,
    count(*) over(partition by user_id order by order_day range 10 preceding) no_of_days
from (select distinct trunc(order_timestamp) order_day, user_id from mytable) t

【讨论】:

以上是关于如何在 Oracle SQL 中滚动计算每个用户的天数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中计算每个用户的唯一日期的平均收入

如何执行 SQL 游标转换

怎么在oracle中查询出所有的视图view?

如何计算Oracle SQL中从右侧开始的列中有多少个零

如何在 oracle-sql 中计算周一待处理票的总数?

SQL severa 中l数据库如何进行查询