我有一个名为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 Statements之外还有解决方法吗?
答案 0 :(得分:0)
您可以自己加入表格,并对您喜欢的指标对应用操作。并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
。
答案 1 :(得分:0)
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
或+
代替。