了解匹配识别中的以下子句
Understanding the below clauses in match recognize
这个问题已经有人回答了,但我无法得到查询的几个部分。下面是输入 table.
ID NAME DISEASE DRUG SHIP_DATE SUPPLY
1 aa D1 dd 10-05-2020 30
1 aa D1 dd 07-06-2020 30
1 aa D1 dd 12-07-2020 30
1 aa D1 dd 09-08-2020 30
1 aa D1 dd 07-09-2020 28
1 aa D1 dd 11-10-2020 28
1 aa D1 dd 10-11-2020 28
2 bb D2 cd 01-01-2020 10
2 bb D2 cd 06-01-2020 10
我的要求是了解下一个订单(发货日期)是早还是晚。
例如-第一个订单是在 10-05-2020 + supply(30) = 09-06-2020(下一个预期日期)但是患者在 07-06-2020 订购所以第二个订单是早期订单 案例。现在,07-06-2020+supply(30)= 09-07-2020(预计日期)但患者在 12-07-2020.Third 订购的订单是 Late Order 案例.
如果订单 早 那么下一个预计日期是 发货日期 + 供应 但如果订单 晚 然后下一个预期日期是 上一个预期日期 + 供应 。(操作会让它更好理解)
ID NAME DISEASE DRUG SHIP_DATE SUPPLY EXP_DATE LATE_OR_EARLY GAP
-- ---- ------- ---- ---------- ---------- ---------- ------------- ---
1 aa D1 dd 10-05-2020 30 first order
1 aa D1 dd 07-06-2020 30 09-06-2020 early
1 aa D1 dd 12-07-2020 30 09-07-2020 late 3
1 aa D1 dd 09-08-2020 30 11-08-2020 early
1 aa D1 dd 07-09-2020 28 10-09-2020 early
1 aa D1 dd 11-10-2020 28 08-10-2020 late 3
1 aa D1 dd 10-11-2020 28 08-11-2020 late 2
2 bb D2 cd 01-01-2020 10 first order
2 bb D2 cd 06-01-2020 10 11-01-2020 early
下面是我从 Stack Overflow 得到的查询:
1. with prep (id, name, disease, drug, ship_date, supply, e_date,
cls, exp_date) as (
select id, name, disease, drug, ship_date, supply, e_date, cls,
case cls when 'A' then lag(e_date + supply)
over (partition by id, disease, drug
order by ship_date)
else e_date end as exp_date
from input_table
match_recognize(
partition by id, disease, drug
order by ship_date
measures a.ship_date + sum(supply) - supply as e_date,
classifier() as cls
all rows per match
pattern (a b*)
define b as ship_date <= a.ship_date + sum(supply) - supply
) ) select id, name, disease, drug, ship_date, supply, exp_date,
case when exp_date is null then 'first order'
when cls = 'A' then 'late'
else 'early' end as late_or_early,
case cls when 'A' then ship_date - exp_date end as gap from prep order by id, disease, drug, ship_date ;
pattern 和 define 子句实际上在这里做什么,它如何计算所需的结果?
pattern (a b*)
匹配一行 a
,然后匹配零行或多行 b
define b as ship_date <= a.ship_date + sum(supply) - supply
a
未定义,因此它将匹配任何一行。
b
被定义为匹配的当前行的 ship_date
小于或等于 <=
ship_date
a
行加上 +
sum
的 supply
(在,因为它是一个聚合函数,所有 a
和 b
中的行当前匹配项)减去 -
匹配的当前行的 supply
。
对于您的数据:
ID NAME DISEASE DRUG SHIP_DATE SUPPLY EXP_DATE LATE_OR_EARLY GAP
-- ---- ------- ---- ---------- ---------- ---------- ------------- ---
1 aa D1 dd 10-05-2020 30 first order
1 aa D1 dd 07-06-2020 30 09-06-2020 early
1 aa D1 dd 12-07-2020 30 09-07-2020 late 3
- 分区的第一行将始终匹配
a
模式。
- 第二行检查
2020-06-07
是否小于或等于 2020-05-10
加上 SUM(30, 30)
(当前匹配中所有供给的总和)减去 30
(当前供应)总计 2020-06-09
。因为这是真的,所以该行是 b
行。
- 第三行检查
2020-07-12
是否小于或等于 2020-05-10
加上 SUM(30, 30, 30)
(当前匹配中所有供给的总和)减去 30
(当前供应)总计 2020-07-09
。由于此为 false,因此该行不包含在先前的模式中,并开始一个新的匹配组作为 a
行。
这个问题已经有人回答了,但我无法得到查询的几个部分。下面是输入 table.
ID NAME DISEASE DRUG SHIP_DATE SUPPLY
1 aa D1 dd 10-05-2020 30
1 aa D1 dd 07-06-2020 30
1 aa D1 dd 12-07-2020 30
1 aa D1 dd 09-08-2020 30
1 aa D1 dd 07-09-2020 28
1 aa D1 dd 11-10-2020 28
1 aa D1 dd 10-11-2020 28
2 bb D2 cd 01-01-2020 10
2 bb D2 cd 06-01-2020 10
我的要求是了解下一个订单(发货日期)是早还是晚。 例如-第一个订单是在 10-05-2020 + supply(30) = 09-06-2020(下一个预期日期)但是患者在 07-06-2020 订购所以第二个订单是早期订单 案例。现在,07-06-2020+supply(30)= 09-07-2020(预计日期)但患者在 12-07-2020.Third 订购的订单是 Late Order 案例.
如果订单 早 那么下一个预计日期是 发货日期 + 供应 但如果订单 晚 然后下一个预期日期是 上一个预期日期 + 供应 。(操作会让它更好理解)
ID NAME DISEASE DRUG SHIP_DATE SUPPLY EXP_DATE LATE_OR_EARLY GAP
-- ---- ------- ---- ---------- ---------- ---------- ------------- ---
1 aa D1 dd 10-05-2020 30 first order
1 aa D1 dd 07-06-2020 30 09-06-2020 early
1 aa D1 dd 12-07-2020 30 09-07-2020 late 3
1 aa D1 dd 09-08-2020 30 11-08-2020 early
1 aa D1 dd 07-09-2020 28 10-09-2020 early
1 aa D1 dd 11-10-2020 28 08-10-2020 late 3
1 aa D1 dd 10-11-2020 28 08-11-2020 late 2
2 bb D2 cd 01-01-2020 10 first order
2 bb D2 cd 06-01-2020 10 11-01-2020 early
下面是我从 Stack Overflow 得到的查询:
1. with prep (id, name, disease, drug, ship_date, supply, e_date,
cls, exp_date) as (
select id, name, disease, drug, ship_date, supply, e_date, cls,
case cls when 'A' then lag(e_date + supply)
over (partition by id, disease, drug
order by ship_date)
else e_date end as exp_date
from input_table
match_recognize(
partition by id, disease, drug
order by ship_date
measures a.ship_date + sum(supply) - supply as e_date,
classifier() as cls
all rows per match
pattern (a b*)
define b as ship_date <= a.ship_date + sum(supply) - supply
) ) select id, name, disease, drug, ship_date, supply, exp_date,
case when exp_date is null then 'first order'
when cls = 'A' then 'late'
else 'early' end as late_or_early,
case cls when 'A' then ship_date - exp_date end as gap from prep order by id, disease, drug, ship_date ;
pattern 和 define 子句实际上在这里做什么,它如何计算所需的结果?
pattern (a b*)
匹配一行 a
,然后匹配零行或多行 b
define b as ship_date <= a.ship_date + sum(supply) - supply
a
未定义,因此它将匹配任何一行。b
被定义为匹配的当前行的ship_date
小于或等于<=
ship_date
a
行加上+
sum
的supply
(在,因为它是一个聚合函数,所有a
和b
中的行当前匹配项)减去-
匹配的当前行的supply
。
对于您的数据:
ID NAME DISEASE DRUG SHIP_DATE SUPPLY EXP_DATE LATE_OR_EARLY GAP
-- ---- ------- ---- ---------- ---------- ---------- ------------- ---
1 aa D1 dd 10-05-2020 30 first order
1 aa D1 dd 07-06-2020 30 09-06-2020 early
1 aa D1 dd 12-07-2020 30 09-07-2020 late 3
- 分区的第一行将始终匹配
a
模式。 - 第二行检查
2020-06-07
是否小于或等于2020-05-10
加上SUM(30, 30)
(当前匹配中所有供给的总和)减去30
(当前供应)总计2020-06-09
。因为这是真的,所以该行是b
行。 - 第三行检查
2020-07-12
是否小于或等于2020-05-10
加上SUM(30, 30, 30)
(当前匹配中所有供给的总和)减去30
(当前供应)总计2020-07-09
。由于此为 false,因此该行不包含在先前的模式中,并开始一个新的匹配组作为a
行。