【问题标题】:How to count no of days per user on a rolling basis in Oracle SQL?如何在 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  

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

【问题讨论】:

    标签: sql oracle date window-functions


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 1970-01-01
        • 2021-03-12
        • 2019-03-28
        • 1970-01-01
        • 2017-06-24
        • 1970-01-01
        相关资源
        最近更新 更多