如何在 Snowflake 中使用展平逻辑
How do I use flatten logic in Snowflake
select * from
(SELECT ID,purchase_list,
CASE WHEN purchase_list LIKE '12432%' THEN replace(purchase_list,12432,'Amt_Saved: Mastercard(12432)')
END AS purchase_amt
FROM (
SELECT ID,index,d.value::string AS purchase_list
FROM (
SELECT ID,c.value::string AS purchase_list
FROM table_1,LATERAL flatten(INPUT=>split(purchase_order_list, '|')) c
), LATERAL flatten(INPUT=>split(purchase_list, ';')) d
)
)WHERE purchase_amt is not null
当我运行上述查询时,我得到如下所述的结果:
ID PURCHASE_LIST PURCHASE_AMT
12810789 12432=3.00 Savings1: Mastercard(12432)=3.00
12810789 12432=0.99 Savings1: Mastercard(12432)=0.99
12810789 12432=0.49 Savings1: Mastercard(12432)=0.49
我想将这些金额相加 (3.00 + 0.99 + 0.49)=4.48 并将此结果显示在同一列或另一列中
结果应如下所示:
ID PURCHASE_LIST PURCHASE_AMT
12810789 12432=4.48 4.48
如何通过使用任何其他逻辑来使用 SUM 函数来实现这个?
敬请指导。提前致谢:)
首先,您现有的 SQL 可以重写为:
SELECT
a.id,
d.value::string AS purchase_list,
IFF( purchase_list LIKE '12432%', REPLACE(purchase_list, 12432, 'Amt_Saved: Mastercard(12432)'), null) purchase_amt
FROM table_1 AS a
,LATERAL flatten(INPUT=>split(a.purchase_order_list, '|')) c
,LATERAL flatten(INPUT=>split(c.value::string, ';')) d
WHERE purchase_amt IS NOT NULL;
因此我们可以添加一个 SUM() OVER() 子句来获取每行的总计,如果您需要部分和总计:
SELECT
a.id,
d.value::string AS purchase_list,
IFF( purchase_list LIKE '12432%', REPLACE(purchase_list, 12432, 'Amt_Saved: Mastercard(12432)'), null) purchase_amt,
SUM(REGEXP_REPLACE(purchase_list, '12432=([0-9.]+)', '\1', 1,1,'e')::number(9,3)) over (partition by id) as sum_total
FROM table_1 AS a
,LATERAL flatten(INPUT=>split(a.purchase_order_list, '|')) c
,LATERAL flatten(INPUT=>split(c.value::string, ';')) d
WHERE purchase_amt IS NOT NULL;
ID
PURCHASE_LIST
PURCHASE_AMT
SUM_TOTAL
12810789
12432=3.00
Amt_Saved: Mastercard(12432)=3.00
4.48
12810789
12432=0.99
Amt_Saved: Mastercard(12432)=0.99
4.48
12810789
12432=0.49
Amt_Saved: Mastercard(12432)=0.49
4.48
或者您可以分组而不关心所有子值:
SELECT
a.id,
SUM(REGEXP_REPLACE(d.value::string, '12432=([0-9.]+)', '\1', 1,1,'e')::number(9,3)) AS sum_total
FROM table_1 AS a
,LATERAL flatten(INPUT=>split(a.purchase_order_list, '|')) c
,LATERAL flatten(INPUT=>split(c.value::string, ';')) d
GROUP BY 1;
给出:
ID
SUM_TOTAL
12810789
4.48
select * from
(SELECT ID,purchase_list,
CASE WHEN purchase_list LIKE '12432%' THEN replace(purchase_list,12432,'Amt_Saved: Mastercard(12432)')
END AS purchase_amt
FROM (
SELECT ID,index,d.value::string AS purchase_list
FROM (
SELECT ID,c.value::string AS purchase_list
FROM table_1,LATERAL flatten(INPUT=>split(purchase_order_list, '|')) c
), LATERAL flatten(INPUT=>split(purchase_list, ';')) d
)
)WHERE purchase_amt is not null
当我运行上述查询时,我得到如下所述的结果:
ID PURCHASE_LIST PURCHASE_AMT
12810789 12432=3.00 Savings1: Mastercard(12432)=3.00
12810789 12432=0.99 Savings1: Mastercard(12432)=0.99
12810789 12432=0.49 Savings1: Mastercard(12432)=0.49
我想将这些金额相加 (3.00 + 0.99 + 0.49)=4.48 并将此结果显示在同一列或另一列中
结果应如下所示:
ID PURCHASE_LIST PURCHASE_AMT
12810789 12432=4.48 4.48
如何通过使用任何其他逻辑来使用 SUM 函数来实现这个?
敬请指导。提前致谢:)
首先,您现有的 SQL 可以重写为:
SELECT
a.id,
d.value::string AS purchase_list,
IFF( purchase_list LIKE '12432%', REPLACE(purchase_list, 12432, 'Amt_Saved: Mastercard(12432)'), null) purchase_amt
FROM table_1 AS a
,LATERAL flatten(INPUT=>split(a.purchase_order_list, '|')) c
,LATERAL flatten(INPUT=>split(c.value::string, ';')) d
WHERE purchase_amt IS NOT NULL;
因此我们可以添加一个 SUM() OVER() 子句来获取每行的总计,如果您需要部分和总计:
SELECT
a.id,
d.value::string AS purchase_list,
IFF( purchase_list LIKE '12432%', REPLACE(purchase_list, 12432, 'Amt_Saved: Mastercard(12432)'), null) purchase_amt,
SUM(REGEXP_REPLACE(purchase_list, '12432=([0-9.]+)', '\1', 1,1,'e')::number(9,3)) over (partition by id) as sum_total
FROM table_1 AS a
,LATERAL flatten(INPUT=>split(a.purchase_order_list, '|')) c
,LATERAL flatten(INPUT=>split(c.value::string, ';')) d
WHERE purchase_amt IS NOT NULL;
ID | PURCHASE_LIST | PURCHASE_AMT | SUM_TOTAL |
---|---|---|---|
12810789 | 12432=3.00 | Amt_Saved: Mastercard(12432)=3.00 | 4.48 |
12810789 | 12432=0.99 | Amt_Saved: Mastercard(12432)=0.99 | 4.48 |
12810789 | 12432=0.49 | Amt_Saved: Mastercard(12432)=0.49 | 4.48 |
或者您可以分组而不关心所有子值:
SELECT
a.id,
SUM(REGEXP_REPLACE(d.value::string, '12432=([0-9.]+)', '\1', 1,1,'e')::number(9,3)) AS sum_total
FROM table_1 AS a
,LATERAL flatten(INPUT=>split(a.purchase_order_list, '|')) c
,LATERAL flatten(INPUT=>split(c.value::string, ';')) d
GROUP BY 1;
给出:
ID | SUM_TOTAL |
---|---|
12810789 | 4.48 |