我有一个表,其中有一个名为metrics的列,它有不同的可能指标,如下所示:
Metric Value
--------------
A 100
B 200
C 300
我想从这个基表派生出另一个表,它可能包含如下行:
Metric Value
--------------
A 100
B 200
C 300
C/A 3
B/A 2
基本上保持原始行不变+根据现有值的组合添加一些新行。
我可以想到的一种方法是: 1.透视数据2.将其放入某个临时表或CTE中3.选择所有现有指标列+我需要的新计算列4.取消透视上一步的输出
有没有更好的方式用SQL来实现这一点?或者任何其他可能的方式?另外,redshift不支持Pivot函数,除了使用Case语句之外,还有其他解决方法吗?
发布于 2018-05-31 08:22:02
您可以将表与自身连接起来,并将操作应用于您喜欢的指标对。并按原样对表执行UNION ALL
操作,以包括原始指标。
对于您的示例,一种可能性是(假设Postgres):
SELECT metric,
value
FROM metrics
UNION ALL
SELECT concat(m1.metric, '/', m2.metric),
m1.value / m2.value
FROM metrics m1
CROSS JOIN metrics m2
WHERE (m1.metric,
m2.metric) IN (('C',
'A'),
('B',
'A'));
当然,这可以扩展到三元,..。操作通过添加另一个连接和几个不同的操作通过添加其他查询并对它们进行UNION
。
发布于 2018-05-31 08:26:21
select
case when x1.metric = x2.metric
then x1.metric
else x1.metric || ' / ' || x2.metric end,
case when x1.metric = x2.metric
then x1.value
else x1.value / x2.value end
from mytable x1
join mytable x2
on x1.metric = x2.metric or x2.metric = 'A'
这是一种方法,它使用纯粹的标准sql。但是,请注意,不同的RDMBS软件具有不同的标准一致性级别,并且可能不支持此处使用的某些功能。具体地说,字符串连接运算符||
并不是在所有数据库中都实现。有些数据库改用函数concat
或+
。
https://stackoverflow.com/questions/50614841
复制相似问题