我们在google工作表中有数千行需要转换并加载到数据库中。数据布局不适合我们的数据库模式,因此需要在将数据加载到数据库之前对其进行转换。
如何将水平数据以编程方式转换为垂直数据?
样本表可用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
答案 0 :(得分:1)
数千行......需要转换并加载到数据库中
基于此问题的标记,我假设数据库是BigQuery
我可以建议将数据加载到BigQuery或创建外部表 - 之后您可以使用以下查询来进行所需的转换
#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
您可以使用问题中的dumy数据进行测试/播放,如下所示
#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
答案 1 :(得分:0)
该查询使用header参数为包含数据的所有行创建单行(每个单元/标题一行)。然后使用JOIN将所有内容吸入一个单元格。然后使用SPLIT将所有数据放入其自己的单元格中。 TRANSPOSE函数根据此数据为每个范围创建一个垂直列。