最小值匹配时返回列名称

时间:2017-11-08 23:31:22

标签: sql teradata

我有一张看起来像这样的表 -

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的格式中完成此操作。

2 个答案:

答案 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,那么前一个人提供的代码就会返回你想要的代码。