根据 Snowflake 中的创建日期顺序检查值优先级
Check values precedence based on creation date order in Snowflake
我有一个小案例,我想使用 SQL/Snowflake 突出显示。
例如(下图table1),如果CF_PO_Number
中值NO PO
的创建日期小于值PO-0257880
的创建日期则PO_Issued = True
Job_ID
CF_PO_Number
Created_At
153428
PO-025780
2021-10-20 10:22:43.000000000
153428
2021-10-20 09:03:14.000000000
153428
NO PO
2021-10-05 13:16:04.000000000
table 1 的期望结果如下,
Job_ID
PO_Issued
153428
True
另一个例子(下图table2),如果CF_PO_Number
中值PO-0257880
的创建日期早于值NO PO
的创建日期则PO_Issued = False
Job_ID
CF_PO_Number
Created_At
153428
NO PO
2021-10-20 10:22:43.000000000
153428
2021-10-20 09:03:14.000000000
153428
PO-025780
2021-10-05 13:16:04.000000000
table 2 的期望结果如下,
Job_ID
PO_Issued
153428
False
此外,CF_PO_Number
只能有一个值,要么 NO PO
表示 PO is required and not issued
然后 PO_Issued = False
或 PO-025780
表示 PO is required and issued
那么PO_Issued = True
,例子很少发生
我希望案子现在已经清楚了。
因此,如果我理解 CF_PO_Number
['NO_PO', 'PO-025780', null]
只能有三个值,我们正在查找 no_po 和 po.
的相关日期
那么这个 SQL 我认为涵盖了您的情况:
刚刚注意到 431 案例
SELECT
job_id,
max(iff(CF_PO_Number='NO PO', Created_At, null)) as no_po_date,
max(iff(CF_PO_Number='PO-025780', Created_At, null)) as po_date,
CASE
WHEN no_po_date is null AND po_date is not null then true
WHEN no_po_date is not null AND po_date is null then false
WHEN no_po_date is null AND po_date is null then false -- CAN THIS HAPPEN?
ELSE no_po_date < po_date
END as PO_Issued
FROM VALUES
(153428, 'PO-025780', '2021-10-20 10:22:43'),
(153428, null, '2021-10-20 09:03:14'),
(153428, 'NO PO', '2021-10-05 13:16:04'),
(153429, 'NO PO', '2021-10-20 10:22:43'),
(153429, null, '2021-10-20 09:03:14'),
(153429, 'PO-025780', '2021-10-05 13:16:04'),
(153430, 'NO PO', '2021-10-05 13:16:04'),
(153431, 'PO-025780', '2021-10-05 13:16:04')
t(Job_ID, CF_PO_Number, Created_At)
GROUP BY 1
ORDER BY 1;
给出:
JOB_ID
NO_PO_DATE
PO_DATE
PO_ISSUED
153,428
2021-10-05 13:16:04
2021-10-20 10:22:43
TRUE
153,429
2021-10-20 10:22:43
2021-10-05 13:16:04
FALSE
153,430
2021-10-05 13:16:04
FALSE
153,431
2021-10-05 13:16:04
TRUE
我有一个小案例,我想使用 SQL/Snowflake 突出显示。
例如(下图table1),如果CF_PO_Number
中值NO PO
的创建日期小于值PO-0257880
的创建日期则PO_Issued = True
Job_ID | CF_PO_Number | Created_At |
---|---|---|
153428 | PO-025780 | 2021-10-20 10:22:43.000000000 |
153428 | 2021-10-20 09:03:14.000000000 | |
153428 | NO PO | 2021-10-05 13:16:04.000000000 |
table 1 的期望结果如下,
Job_ID | PO_Issued |
---|---|
153428 | True |
另一个例子(下图table2),如果CF_PO_Number
中值PO-0257880
的创建日期早于值NO PO
的创建日期则PO_Issued = False
Job_ID | CF_PO_Number | Created_At |
---|---|---|
153428 | NO PO | 2021-10-20 10:22:43.000000000 |
153428 | 2021-10-20 09:03:14.000000000 | |
153428 | PO-025780 | 2021-10-05 13:16:04.000000000 |
table 2 的期望结果如下,
Job_ID | PO_Issued |
---|---|
153428 | False |
此外,CF_PO_Number
只能有一个值,要么 NO PO
表示 PO is required and not issued
然后 PO_Issued = False
或 PO-025780
表示 PO is required and issued
那么PO_Issued = True
,例子很少发生
我希望案子现在已经清楚了。
因此,如果我理解 CF_PO_Number
['NO_PO', 'PO-025780', null]
只能有三个值,我们正在查找 no_po 和 po.
那么这个 SQL 我认为涵盖了您的情况: 刚刚注意到 431 案例
SELECT
job_id,
max(iff(CF_PO_Number='NO PO', Created_At, null)) as no_po_date,
max(iff(CF_PO_Number='PO-025780', Created_At, null)) as po_date,
CASE
WHEN no_po_date is null AND po_date is not null then true
WHEN no_po_date is not null AND po_date is null then false
WHEN no_po_date is null AND po_date is null then false -- CAN THIS HAPPEN?
ELSE no_po_date < po_date
END as PO_Issued
FROM VALUES
(153428, 'PO-025780', '2021-10-20 10:22:43'),
(153428, null, '2021-10-20 09:03:14'),
(153428, 'NO PO', '2021-10-05 13:16:04'),
(153429, 'NO PO', '2021-10-20 10:22:43'),
(153429, null, '2021-10-20 09:03:14'),
(153429, 'PO-025780', '2021-10-05 13:16:04'),
(153430, 'NO PO', '2021-10-05 13:16:04'),
(153431, 'PO-025780', '2021-10-05 13:16:04')
t(Job_ID, CF_PO_Number, Created_At)
GROUP BY 1
ORDER BY 1;
给出:
JOB_ID | NO_PO_DATE | PO_DATE | PO_ISSUED |
---|---|---|---|
153,428 | 2021-10-05 13:16:04 | 2021-10-20 10:22:43 | TRUE |
153,429 | 2021-10-20 10:22:43 | 2021-10-05 13:16:04 | FALSE |
153,430 | 2021-10-05 13:16:04 | FALSE | |
153,431 | 2021-10-05 13:16:04 | TRUE |