将 google 工作表中的水平数据转换为垂直数据
Transform horizontal to vertical data in google sheets
我们在 google sheet 中有数千行需要转换并加载到数据库中。数据的布局不适合我们的数据库架构,因此在将数据加载到数据库之前需要对其进行转换。
如何以编程方式将水平数据转换为垂直数据?
样品 sheet 可用 here。
源数据(水平布局):
Company name 2017-01-14 2017-02-14 2017-03-14
Company 1 1522 1141 1505
Company 2 1866 1909 1610
Company 3 1726 1237 1057
Company 4 1427 1375 1446
Company 5 1590 1819 1352
所需结果(垂直布局):
2017-01-14 Company 1 1522
2017-01-14 Company 2 1866
2017-01-14 Company 3 1726
2017-01-14 Company 4 1427
2017-01-14 Company 5 1590
2017-02-14 Company 1 1141
2017-02-14 Company 2 1909
2017-02-14 Company 3 1237
2017-02-14 Company 4 1375
2017-02-14 Company 5 1819
2017-03-14 Company 1 1505
2017-03-14 Company 2 1610
2017-03-14 Company 3 1057
2017-03-14 Company 4 1446
2017-03-14 Company 5 1352
查询使用 header 参数为所有包含数据的行创建一行(每个 cell/header 一行)。然后使用 JOIN 将所有内容吸入一个单元格。然后使用 SPLIT 将所有数据放入其自己的单元格中。 TRANSPOSE 函数根据该数据为每个范围创建一个垂直列。
thousands of rows ... need to be transformed and loaded into a database
根据这个问题的标签,我假设数据库是 BigQuery
我可以建议将数据按原样加载到 BigQuery 或创建外部 table - 之后您可以使用下面的查询进行所需的转换
#standardSQL
SELECT
['2017-01-14', '2017-02-14', '2017-03-14'][OFFSET(pos)] day,
company_name,
value
FROM `project.dataset.table`,
UNNEST([date_20170114, date_20170214, date_20170314]) value WITH OFFSET pos
-- ORDER BY day, company_name
您可以使用问题中的虚拟数据来测试/使用它,如下所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'Company 1' company_name, 1522 date_20170114, 1141 date_20170214, 1505 date_20170314 UNION ALL
SELECT 'Company 2', 1866, 1909, 1610 UNION ALL
SELECT 'Company 3', 1726, 1237, 1057 UNION ALL
SELECT 'Company 4', 1427, 1375, 1446 UNION ALL
SELECT 'Company 5', 1590, 1819, 1352
)
SELECT
['2017-01-14', '2017-02-14', '2017-03-14'][OFFSET(pos)] day,
company_name,
value
FROM `project.dataset.table`,
UNNEST([date_20170114, date_20170214, date_20170314]) value WITH OFFSET pos
ORDER BY day, company_name
我们在 google sheet 中有数千行需要转换并加载到数据库中。数据的布局不适合我们的数据库架构,因此在将数据加载到数据库之前需要对其进行转换。
如何以编程方式将水平数据转换为垂直数据?
样品 sheet 可用 here。
源数据(水平布局):
Company name 2017-01-14 2017-02-14 2017-03-14
Company 1 1522 1141 1505
Company 2 1866 1909 1610
Company 3 1726 1237 1057
Company 4 1427 1375 1446
Company 5 1590 1819 1352
所需结果(垂直布局):
2017-01-14 Company 1 1522
2017-01-14 Company 2 1866
2017-01-14 Company 3 1726
2017-01-14 Company 4 1427
2017-01-14 Company 5 1590
2017-02-14 Company 1 1141
2017-02-14 Company 2 1909
2017-02-14 Company 3 1237
2017-02-14 Company 4 1375
2017-02-14 Company 5 1819
2017-03-14 Company 1 1505
2017-03-14 Company 2 1610
2017-03-14 Company 3 1057
2017-03-14 Company 4 1446
2017-03-14 Company 5 1352
查询使用 header 参数为所有包含数据的行创建一行(每个 cell/header 一行)。然后使用 JOIN 将所有内容吸入一个单元格。然后使用 SPLIT 将所有数据放入其自己的单元格中。 TRANSPOSE 函数根据该数据为每个范围创建一个垂直列。
thousands of rows ... need to be transformed and loaded into a database
根据这个问题的标签,我假设数据库是 BigQuery
我可以建议将数据按原样加载到 BigQuery 或创建外部 table - 之后您可以使用下面的查询进行所需的转换
#standardSQL
SELECT
['2017-01-14', '2017-02-14', '2017-03-14'][OFFSET(pos)] day,
company_name,
value
FROM `project.dataset.table`,
UNNEST([date_20170114, date_20170214, date_20170314]) value WITH OFFSET pos
-- ORDER BY day, company_name
您可以使用问题中的虚拟数据来测试/使用它,如下所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'Company 1' company_name, 1522 date_20170114, 1141 date_20170214, 1505 date_20170314 UNION ALL
SELECT 'Company 2', 1866, 1909, 1610 UNION ALL
SELECT 'Company 3', 1726, 1237, 1057 UNION ALL
SELECT 'Company 4', 1427, 1375, 1446 UNION ALL
SELECT 'Company 5', 1590, 1819, 1352
)
SELECT
['2017-01-14', '2017-02-14', '2017-03-14'][OFFSET(pos)] day,
company_name,
value
FROM `project.dataset.table`,
UNNEST([date_20170114, date_20170214, date_20170314]) value WITH OFFSET pos
ORDER BY day, company_name