提问人:Inbalw 提问时间:11/12/2023 最后编辑:nbkInbalw 更新时间:11/13/2023 访问量:63
将行透视为没有聚合的列 - 在 snowflake 中 (sql)
Pivot rows to columns without aggregate - in snowflake (sql)
问:
我正在寻找一种在不执行聚合的情况下将行透视到列的方法。我已经尝试将值转换为字符串并执行 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,但它不起作用
答:
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 上找到一个好的答案,请提供所有详细信息,以供将来参考。
评论