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

eanckbw9  于 2021-08-01  发布在  Java
关注(0)|答案(2)|浏览(487)

继上一个问题之后,我有一个名为orders的表格,里面有关于下订单时间和谁下订单的信息。

  1. order_timestamp user_id
  2. -------------------- ---------
  3. 1-JUN-20 02.56.12 123
  4. 3-JUN-20 12.01.01 533
  5. 23-JUN-20 08.42.18 123
  6. 12-JUN-20 02.53.59 238
  7. 19-JUN-20 02.33.72 34

我想计算一个用户在过去10天的订单日滚动计数。例如,在6月20日之后的最后10天内,用户34在其中的5天下了订单。然后在6月21日之后的最后10天,用户34在其中6天下了订单
最后,表格应该是这样的:

  1. date user_id no_of_days
  2. ----------- --------- ------------
  3. 20-JUN-20 34 5
  4. 20-JUN-20 123 10
  5. 20-JUN-20 533 2
  6. 20-JUN-20 238 3
  7. 21-JUN-20 34 6
  8. 21-JUN-20 123 10

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

lymnna71

lymnna711#

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

  1. select day, user_id,
  2. count(*) over (partition by user_id range between interval '10' day preceding and current row)
  3. from (select distinct trunc(order_timestamp) as day, user_id
  4. from t
  5. ) t
ekqde3dh

ekqde3dh2#

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

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

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

  1. select
  2. order_day,
  3. user_id,
  4. count(*) over(partition by user_id order by order_day range 10 preceding) no_of_days
  5. from (select distinct trunc(order_timestamp) order_day, user_id from mytable) t

相关问题