简体   繁体   中英

How to count no of days per user on a rolling basis in Oracle SQL?

Following on from a previous question , in which i have a table called orders with information regarding the time an order was placed and who made that order.

   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  

I would like to calculate a daily rolling count of the number of days a user made an order in a past 10 days. For example, in the last 10 days from the 20th June, user 34 made an order on 5 of those days. Then in the last 10 days from the 21st June, user 34 made an order on 6 of those days

In the end the table should be like this:


    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  

How would the query be written for this kind of analysis? Please let me know if my question is unclear/more infor is required. Thanks to you in advancement.

You can use window functions for this. Start by getting one row per user per day. And then use a rolling sum:

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

Assuming that a user places one order a day maximum, you can use window functions as follows:

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

Otherwise, you can get the distinct orders per day first:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM