不确定要调用哪些函数,但转置是我能想到的最接近的东西。
我在BigQuery中有一个配置如下的表格:
但我想查询一个配置为以下方式的表格:
创建这个表的SQL代码是什么样子的?
谢谢!
不确定要调用哪些函数,但转置是我能想到的最接近的东西。
我在BigQuery中有一个配置如下的表格:
但我想查询一个配置为以下方式的表格:
创建这个表的SQL代码是什么样子的?
谢谢!
2021年更新:
BigQuery引入了新的UNPIVOT操作符。
在使用UNPIVOT将Q1、Q2、Q3和Q4旋转到销售额和季度列之前:
产品 | Q1 | Q2 | Q3 | Q4 |
---|---|---|---|---|
Kale | 51 | 23 | 45 | 3 |
Apple | 77 | 0 | 25 | 2 |
使用UNPIVOT将Q1、Q2、Q3和Q4旋转到销售额和季度列后:
产品 | 销售额 | 季度 |
---|---|---|
Kale | 51 | Q1 |
Kale | 23 | Q2 |
Kale | 45 | Q3 |
Kale | 3 | Q4 |
Apple | 77 | Q1 |
Apple | 0 | Q2 |
Apple | 25 | Q3 |
Apple | 2 | Q4 |
查询:
WITH Produce AS (
SELECT 'Kale' as product, 51 as Q1, 23 as Q2, 45 as Q3, 3 as Q4 UNION ALL
SELECT 'Apple', 77, 0, 25, 2
)
SELECT * FROM Produce
UNPIVOT(sales FOR quarter IN (Q1, Q2, Q3, Q4))
2020更新: fhoffa.x.unpivot()
请参见:
我创建了一个公共持久性UDF。如果你有一个名为a
的表,你可以将整行数据传递给UDF以进行逆转置:
SELECT geo_type, region, transportation_type, unpivotted
FROM `fh-bigquery.public_dump.applemobilitytrends_20200414` a
, UNNEST(fhoffa.x.unpivot(a, '_2020')) unpivotted
将这样的表格:
转化为这个样子:
正如评论所提到的,我的解决方案并未解决问题。
因此,这里有一个变化,同时我正在寻找如何将所有内容整合成一个:
CREATE TEMP FUNCTION unpivot(x ANY TYPE) AS (
(
SELECT
ARRAY_AGG(STRUCT(
REGEXP_EXTRACT(y, '[^"]+') AS key
, REGEXP_EXTRACT(y, ':([0-9]+)') AS value
))
FROM UNNEST((
SELECT REGEXP_EXTRACT_ALL(json,'"[smlx][meaxl]'||r'[^:]+:\"?[^"]+?') arr
FROM (SELECT TO_JSON_STRING(x) json))) y
)
);
SELECT location, unpivotted.*
FROM `robotic-charmer-726.bl_test_data.reconfiguring_a_table` x
, UNNEST(unpivot(x)) unpivotted
使用表的 UNION(在 BigQuery 中使用“,”)以及一些列别名:SELECT Location, Size, Quantity
FROM (
SELECT Location, 'Small' as Size, Small as Quantity FROM [table]
), (
SELECT Location, 'Medium' as Size, Medium as Quantity FROM [table]
), (
SELECT Location, 'Large' as Size, Large as Quantity FROM [table]
)
@Felipe,我尝试使用标准SQL,但在您的查询的第一行上出现错误,显示:“列名位置不明确 [1:8]”
我使用了另一种查询方法,对我有效:
"最初的回答"
SELECT Location, 'Small' as Size, Small as Quantity FROM `table`
UNION ALL
SELECT Location, 'Medium' as Size, Medium as Quantity FROM `table`
UNION ALL
SELECT Location, 'Large' as Size, Large as Quantity FROM `table`
STRUCT
、ARRAY
和CROSS JOIN
+UNNEST
:WITH
My_Table_Metrics_Data AS (
SELECT
...,
[
STRUCT('...' AS Metric, ... AS Data),
STRUCT('...' AS Metric, ... AS Data),
] AS Metrics_Data
FROM
`My_Dataset.My_Table`
WHERE
...
)
SELECT
...,
Metric_Data
FROM
My_Table_Metrics_Data
CROSS JOIN
UNNEST(My_Table_Metrics_Data.Metrics_Data) AS Metric_Data
in()
语句中? - undefined