AWS Redshift:从列到行(从宽到长)
AWS Redshift: columns into rows (wide to long)
我正在编写一个查询,其结果将在 redash 上显示为仪表板。查询基本上是特定时间范围内table几列的总和:
SELECT
sum(col_A),
sum(col_B),
sum(col_C)
FROM
table_X
WHERE
timestamp > '2018-01-01'
AND timestamp < '2018-02-01'
结果是这样的:
col_A col_B col_C
123 456 789
但是,要在 redash 上正确呈现仪表板,我需要长格式的结果:
column sum
col_A 123
col_B 456
col_C 789
如何将结果从宽格式转换为长格式?
一个简单的方法是使用 union all
:
SELECT sum(col_A) FROM table_X WHERE timestamp > '2018-01-01' AND timestamp < '2018-02-01'
UNION ALL
SELECT sum(col_B) FROM table_X WHERE timestamp > '2018-01-01' AND timestamp < '2018-02-01'
UNION ALL
SELECT sum(col_C) FROM table_X WHERE timestamp > '2018-01-01' AND timestamp < '2018-02-01';
您可能需要注意排序。我会包括第二列,指定正在聚合的内容。
三个独立的查询并不像听起来那么糟糕。 Redshift 是一个列式数据库,因此只应读取列引用。
我正在编写一个查询,其结果将在 redash 上显示为仪表板。查询基本上是特定时间范围内table几列的总和:
SELECT
sum(col_A),
sum(col_B),
sum(col_C)
FROM
table_X
WHERE
timestamp > '2018-01-01'
AND timestamp < '2018-02-01'
结果是这样的:
col_A col_B col_C
123 456 789
但是,要在 redash 上正确呈现仪表板,我需要长格式的结果:
column sum
col_A 123
col_B 456
col_C 789
如何将结果从宽格式转换为长格式?
一个简单的方法是使用 union all
:
SELECT sum(col_A) FROM table_X WHERE timestamp > '2018-01-01' AND timestamp < '2018-02-01'
UNION ALL
SELECT sum(col_B) FROM table_X WHERE timestamp > '2018-01-01' AND timestamp < '2018-02-01'
UNION ALL
SELECT sum(col_C) FROM table_X WHERE timestamp > '2018-01-01' AND timestamp < '2018-02-01';
您可能需要注意排序。我会包括第二列,指定正在聚合的内容。
三个独立的查询并不像听起来那么糟糕。 Redshift 是一个列式数据库,因此只应读取列引用。