将行透视为没有聚合的列 - 在 snowflake 中 (sql)

Pivot rows to columns without aggregate - in snowflake (sql)

提问人:Inbalw 提问时间:11/12/2023 最后编辑:nbkInbalw 更新时间:11/13/2023 访问量:63

问:

我正在寻找一种在不执行聚合的情况下将行透视到列的方法。我已经尝试将值转换为字符串并执行 max/min,它仍然将值引用为数字并返回 max/min,省略其余数据。

初始查询为: select * table,lateral flatten(input =>APINVOICELINES,RECURSIVE => TRUE) where id = 29604361

键和值的结果:

钥匙 价值
编号 "3"
编号 "4"
编号 "5"

每次我用max(value)执行pivot时,我只得到id为“5”的行,而我用min(value)执行pivot时,我只得到id为“3”的行。 例如:

地位 编号
1 "3"

我希望得到 3 行,“3”、“4”和“5”

地位 编号
1 "3"
1 "4"
1 "5"

我该怎么做?

此外,如果您知道将雪花中的模式“[{},{},{}]中的数据展平为行的更好方法,我很想知道。

谢谢。

我尝试了所有已知的 agg 函数,我还尝试在透视之前将值转换为 varchar,但它不起作用

SQL JSON 透视 Snowflake-Cloud-Data-Platform

评论

0赞 Mike Walton 11/13/2023
您能否提供正在执行的查询?您提供的是零碎的信息,但不是某人帮助您所需的所有细节。例如,神秘的“状态=1”从何而来?
0赞 Inbalw 11/13/2023
status 是原始表中的字段之一,假设我有 status, key, value SELECT * FROM ( SELECT status,key, value FROM table ) AS source PIVOT ( max(value) FOR key IN ( 1,2,3,4,5,6,7,8,9,10,11,12 ) ) AS pvt( )
0赞 Mike Walton 11/13/2023
那你为什么要调整扁平化的结果呢?您已经以所需的方式对数据进行了平展,只需在平展语句的选择中选择正确的字段即可。

答:

0赞 Mike Walton 11/13/2023 #1

在下面的扁平化语句中,您已经在记录中创建了需要它们的数据。没有必要从我从你的问题细节中看出这些数据来透视或汇总这些数据:

select  * 
from table t,
lateral flatten(input =>APINVOICELINES,RECURSIVE => TRUE) f
where id = 29604361;

只需从每个字段请求正确的字段:

select  t.source, f.value 
from table t,
lateral flatten(input =>APINVOICELINES,RECURSIVE => TRUE) f
where id = 29604361;

我发布了这个作为答案,因为它比在评论中更容易看到,但如果这不是你要问的,那么请告诉我......我会删除。

评论

0赞 Inbalw 11/14/2023
我希望每个键都成为一列,将行转置为列
0赞 Inbalw 11/14/2023
我实际上从 chatGPT 那里得到了一个很好的答案: SELECT id, MAX(CASE WHEN attribute = 'age' THEN value END) AS age, MAX(CASE WHEN attribute = 'name' THEN value END) AS name, MAX(CASE WHEN attribute = 'city' THEN value END) AS city FROM ( SELECT id, attribute, value, ROW_NUMBER() OVER (PARTITION BY id, attribute ORDER BY id) AS rn FROM my_table ) GROUP BY ID, rn 按 ID 排序;
0赞 Mike Walton 11/15/2023
您关于希望每个键成为一列的评论在您最初的请求中会有所帮助。如果您想在 Stackoverflow 上找到一个好的答案,请提供所有详细信息,以供将来参考。