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你想要的了。
我有一个 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你想要的了。