我有一张看起来像这样的表 -
build\ios
基本上,我想填充最后一列ZIP DC1 DC2 DC3 Min Min(DC)
1 2 3 4 2 DC1
2 5 4 3 3 DC3
。该列应显示Min(DC)
列的相应DC。我使用vlookp一直在使用excel y,但由于我的数据集已经增长,我需要在Teradata或任何其他基于sql的格式中完成此操作。
答案 0 :(得分:1)
这是一种方法:
select t.*, least(dc1, dc2, dc3) as "Min",
(case least(dc1, dc2, dc3)
when dc1 then 'dc1'
when dc2 then 'dc2'
when dc3 then 'dc3'
end) as MinCol
如果要返回具有最小值的所有列:
select t.*, least(dc1, dc2, dc3) as "Min",
((case dc1 = least(dc1, dc2, dc3) then 'dc1;' else '' end) ||
(case dc2 = least(dc1, dc2, dc3) then 'dc2;' else '' end) ||
(case dc3 = least(dc1, dc2, dc3) then 'dc3;' else '' end) ||
) as MinCols
. . .
答案 1 :(得分:1)
注意,在Teradata中,您可以在同一查询中引用别名列。我注意到你不能在Postgres中轻易做到这一点,这已经成为一个痛苦的屁股。重写上一个查询:
SELECT t.*,
LEAST(dc1, dc2, dc3) AS MyMin,
((CASE dc1 = MyMin THEN 'dc1;' ELSE '' END) ||
(CASE dc2 = MyMin THEN 'dc2;' ELSE '' END) ||
(CASE dc3 = MyMin THEN 'dc3;' ELSE '' END) ||
) AS MinCols
我没有检查这是否有效,但你明白了。
至于处理dc1 = dc3的情况,你可以这样做:
CASE WHEN dc1 = dc3 THEN dc1 || '_' || dc3 ELSE <blah> END AS <MyExpressionAlias>
||是SQL
中的连接字符但是,如果多列共享MinValue,那么前一个人提供的代码就会返回你想要的代码。