Может ли кто-нибудь объяснить приведенные ниже пункты в распознавании совпадений?
На этот вопрос уже дан ответ, но я не смог получить некоторые части запроса. Ниже приведена таблица ввода.
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. Третий заказ - дело с поздним заказом .
Если заказ ранний, то следующей ожидаемой датой будет дата отгрузки + поставка, но если заказ запоздал, то следующей ожидаемой датой будет предыдущая ожидаемая дата + поставка . (Op поможет лучше понять)
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
Ниже приведен запрос, полученный мной из StackOverflow.
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 ;
Может ли кто-нибудь уточнить, какой шаблон и предложение define здесь на самом деле делают и как они вычисляют желаемый результат?
1 ответ
pattern (a b*)
Соответствует одной строке как, а затем нулю или более строкам как
define b as ship_date <= a.ship_date + sum(supply) - supply
- не определен, поэтому он будет соответствовать любой отдельной строке.
- определяется таким образом, что текущая сопоставленная строка меньше или равна
<=
тоship_date
ряда плюс+
тоsum
из (в, поскольку это функция агрегирования, всеa
а такжеb
строк в текущем совпадении) минус-
тоsupply
текущей сопоставляемой строки.