[英]Using “match_recognize” in a Common Table Expression in Snowflake
[英]Oracle SQL - How to create common date periods (using MATCH_RECOGNIZE?)
我将日期划分为正确的时期有问题。 这是一个例子:
ID | 数数 | 代码 | date_from | date_to |
---|---|---|---|---|
4364 | 2 | 201 | 2022 年 1 月 8 日 15:00:00 | 2022 年 10 月 9 日 22:00:00 |
4364 | 2 | 201 | 13/09/2022 05:20:00 | 2022 年 9 月 30 日 17:00:00 |
4364 | 2 | 4013 | 29/08/2022 04:48:00 | 19/11/2022 13:43:00 |
我的目标是获得这些日期的共同时期,因此在这种情况下它将是:
预期结果:
29/08/2022 15:00 - 10/09/2022 22:00
13/09/2022 05:20 - 30/09/2022 17:00
替代案例:
IF
201 - the same two rows
4013 - 10/08/2022 - 08/09/2022
THEN EXPECTED RESULT:
10/08/2022 - 08/09/2022
13/09/2022 - 30/09/2022
IF
201 - the same two rows
4013 - 15/09/2022 - 22/09/2022
THEN EXPECTED RESULT:
01/08/2022 - 10/09/2022
15/09/2022 - 22/09/2022
IF
201 - the same two rows
4013 - 11/09/2022 - 12/09/2022
THEN EXPECTED RESULT:
NULL (zero rows)
棘手的部分是每个“代码”已经正确返回句点(这就是为什么 201 有两个句点),所以我需要以某种方式组合不同的代码
我正在使用这样的东西(但如果“代码 4013”与 201 的两个日期重叠,它就不能正常工作)
SELECT *
FROM table_gtt
MATCH_RECOGNIZE (PARTITION BY id
ORDER BY date_from, date_to
MEASURES
MIN(date_from) date_from
,MAX(date_to) date_to
PATTERN (overlap* last_row)
DEFINE
overlap AS MAX(date_to) >= NEXT(date_from)
)
谁能知道如何解决这个问题?
数据:
CREATE GLOBAL TEMPORARY TABLE table_gtt
ON COMMIT PRESERVE ROWS
AS
select 4364 id, 2 count, 201 code, TO_DATE('01/08/2022 15:00', 'DD/MM/YYYY HH24:MI') date_from, TO_DATE('10/09/2022 22:00', 'DD/MM/YYYY HH24:MI') date_to from dual
union all
select 4364 id, 2 count, 201 code, TO_DATE('13/09/2022 05:20', 'DD/MM/YYYY HH24:MI') date_from, TO_DATE('30/09/2022 17:00', 'DD/MM/YYYY HH24:MI') date_to from dual
union all
select 4364 id, 2 count, 4013 code, TO_DATE('29/08/2022 04:48', 'DD/MM/YYYY HH24:MI') date_from, TO_DATE('19/11/2022 13:43', 'DD/MM/YYYY HH24:MI') date_to from dual;
如果您无法定义数据的唯一 PARTITION,您将无法使用 MATCH_RECOGNIZE 执行任务。
如果您确定日期间隔在 (id, code) 对中不相交,则最好尝试使用 self JOIN,否则您必须先按分区 (id, code) 合并(该部分可以使用 MATCH_RECOGNIZE 完成)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.