gpt4 book ai didi

sql - 在大查询中从宽到长 reshape (标准 SQL)

转载 作者:行者123 更新时间:2023-12-04 11:19:03 24 4
gpt4 key购买 nike

不幸的是,在 BQ 中 reshape 它不像在 R 中那么容易,我无法为这个项目导出我的数据。

这是输入

date    country A             B         C      D
20170928 CH 3000.3 121 13 3200
20170929 CH 2800.31 137 23 1614.31

预期产出
date    country Metric  Value  
20170928 CH A 3000.3
20170928 CH B 121
20170928 CH C 13
20170928 CH D 3200
20170929 CH A 2800.31
20170929 CH B 137
20170929 CH C 23
20170929 CH D 1614.31

我的表还有更多的列和行(但我认为需要很多手册)

最佳答案

以下是 BigQuery 标准 SQL,不需要重复选择,具体取决于列数。它会选择尽可能多的并将它们转换为指标和值

#standardSQL
SELECT DATE, country,
metric, SAFE_CAST(value AS FLOAT64) value
FROM (
SELECT DATE, country,
REGEXP_REPLACE(SPLIT(pair, ':')[OFFSET(0)], r'^"|"$', '') metric,
REGEXP_REPLACE(SPLIT(pair, ':')[OFFSET(1)], r'^"|"$', '') value
FROM `project.dataset.yourtable` t,
UNNEST(SPLIT(REGEXP_REPLACE(to_json_string(t), r'{|}', ''))) pair
)
WHERE NOT LOWER(metric) IN ('date', 'country')

您可以使用虚拟数据在您的问题中测试/玩上面
#standardSQL
WITH `project.dataset.yourtable` AS (
SELECT '20170928' DATE, 'CH' country, 3000.3 A, 121 B, 13 C, 3200 D UNION ALL
SELECT '20170929', 'CH', 2800.31, 137, 23, 1614.31
)
SELECT DATE, country,
metric, SAFE_CAST(value AS FLOAT64) value
FROM (
SELECT DATE, country,
REGEXP_REPLACE(SPLIT(pair, ':')[OFFSET(0)], r'^"|"$', '') metric,
REGEXP_REPLACE(SPLIT(pair, ':')[OFFSET(1)], r'^"|"$', '') value
FROM `project.dataset.yourtable` t,
UNNEST(SPLIT(REGEXP_REPLACE(to_json_string(t), r'{|}', ''))) pair
)
WHERE NOT LOWER(metric) IN ('date', 'country')

结果如预期
DATE        country metric  value    
20170928 CH A 3000.3
20170928 CH B 121.0
20170928 CH C 13.0
20170928 CH D 3200.0
20170929 CH A 2800.31
20170929 CH B 137.0
20170929 CH C 23.0
20170929 CH D 1614.31

关于sql - 在大查询中从宽到长 reshape (标准 SQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47650782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com