你能帮我在Oracle21c中创建一个递归查询或使用其他方法来解决这个问题吗?

我的数据有三列:tailwind 车、客户和约会.这一列是我自己添加的.

我想要的是一个递归查询或类似的东西,考虑到每个日期,并检索客户/S在过go 3周(每周无例外)至少1次骑行的每个日期,将它们相加,结果应该如名为最终结果的列中所示.

我把DDL和DML语句放在数据库提琴https://dbfiddle.uk/RT1G3uSp中,包括我的try ,但我try 的不起作用. 首先,我try 在连接中加入条件,然后try 在Rn上连接,但这不是它应该采用的方式.

我想澄清一下我的要求-对于1号客户,我想知道他是否在过go 3周内参加过任何骑行活动,如果他每周至少参加一次骑行,那么在第4周,它应该标记为1,在第5周,这就是为什么周编号列也必须考虑在内, 1号客户在第2周、第3周和第4周都有tailwind 车,他必须再次标记为1,之前的1我们现在必须有2. 在第6周,客户1在第3、4、5周再次出现,他必须有1,加上之前的2,应该有3.

这就是为什么我说递归查询,每次我们都要回go 看看各自的客户是否在过go 3周中每周至少有一次乘车.这种方式应该适用于所有的客户.

我希望它现在更有意义了.

如果有什么不清楚的地方,请再问我.

提前感谢您的帮助

Ride    Client  Date           Weeknum  Final Result
1         1    1/2/2023           1               0
2         1    1/5/2023           1               0
3         3    1/6/2023           1               0
4         1    1/11/2023          2               0
5         2    1/12/2023          2               0
6         1    1/16/2023          3               0
7         2    1/19/2023          3               0
8         1    1/24/2023          4               1
9         2    1/24/2023          4               0
10        1    1/30/2023          5               2
11        2     2/2/2023          5               1
12        2     2/8/2023          6               2
13        1     2/9/2023          6               3

推荐答案

它可以通过使用MATCH_RECOGNIZE:

WITH cte AS (
   -- single instance per client,week
   SELECT  CLIENT, MIN(RIDE) AS RIDE, trunc(data,'IW') AS date_week_trunc
   FROM PROB
   GROUP BY CLIENT, trunc(data,'IW')
)
SELECT 
  MR.*
  ,COUNT(MR.CLS) OVER(PARTITION BY CLIENT ORDER BY date_week_trunc) AS final_result
FROM cte  T
MATCH_RECOGNIZE (
   PARTITION BY CLIENT
   ORDER BY date_week_trunc
   MEASURES CLASSIFIER() AS CLS
   ALL ROWS PER MATCH WITH UNMATCHED ROWS
   PATTERN (B+)
   DEFINE B AS (    B.date_week_trunc = PREV(B.date_week_trunc,1) + 7
                AND B.date_week_trunc = PREV(B.date_week_trunc,2) + 14
                AND B.date_week_trunc = PREV(B.date_week_trunc,3) + 21
               )
) MR
ORDER BY RIDE;

输出:

enter image description here

100

如何运作:

  • 每周开始每名客户获得单一条目-date_week_trunc
  • 判断前3周是否有条目-cls
  • 计算运行总数-final_result

Sql相关问答推荐

GROUP BY和GROUP_CONCAT用于计算比赛排名

如何通过比较不同表中相同ID S的值来筛选ID为S的列表?

通过 Select 值的顺序进行排序ClickHouse

分组多输出访问查询问题

在SQL查询中使用COALESS

如何计算一个用户S的日常连胜?

过go 四周未填充的数据,即W50,51,52-SQL

PostgreSQL:查找继承表中的特定记录属于哪个表

排除具有部分匹配条件的记录

为什么左联接结果在MS Access数据库中不匹配

Netezza SQL:判断两个表是否相同

如何修复初学者 SQL INNER JOIN 查询错误

返回给定日期后的第 4 个工作日(不包括公众假期)

如何在 DAX 中通过 Window 函数应用订单

将有效数字作为 varchar 返回的 SQL 函数

过滤具有一对多关系的两个表之间的数据

BigQuery 错误:SELECT 列表表达式引用 esthetician.LICENSE_TYPE,它既未在 [49:8] 分组也未聚合

SQL:获取连接表的第一个项目

如何优化sql请求?

Snowflake SQL group-by 的行为不同,具体取决于列是按位置引用还是按别名引用