Return 最小值匹配时的列名

Return column name when the min value matches

我有一个 table 看起来像这样 -

ZIP DC1 DC2 DC3 Min Min(DC)
1   2   3   4   2   DC1
2   5   4   3   3   DC3

基本上,我想填充最后一列 Min(DC)。该列应显示 Min 列的相应 DC。我一直在用 excel y 使用 vlookp 来做这件事,但由于我的数据集已经增长,我需要在 Teradata 或任何其他基于 sql 的格式中完成这项工作。

这是一种方法:

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

如果要return所有具有最小值的列:

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
. . .

请注意,在 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,那么前面那个人提供的代码看起来已经return你想要的了。