如何在 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 中滚动计算每个用户的天数?的主要内容,如果未能解决你的问题,请参考以下文章