Snowflake技术问询:如何获取LEAST函数取值对应的列名?
如何在Snowflake中获取最小值对应的列名
在Snowflake查询中已生成Rank_A和Rank_B列,并用LEAST函数得到每行的最小值,现在需要新增一列显示该最小值来自哪一列,期望输出如下:
| Rank_A | Rank B | LEAST | Column Name of Least Value |
|---|---|---|---|
| 1 | 3 | 1 | Rank_A |
| 2 | 4 | 2 | Rank_A |
| 5 | 4 | 4 | Rank_B |
以下是两种Snowflake原生解决方案:
方法1:使用CASE WHEN逻辑判断
针对仅两列的场景,直接通过CASE WHEN比较值即可,逻辑清晰直观:
SELECT Rank_A, Rank_B, LEAST(Rank_A, Rank_B) AS LEAST, CASE WHEN Rank_A <= Rank_B THEN 'Rank_A' ELSE 'Rank_B' END AS "Column Name of Least Value" FROM your_table; -- 替换为你的表名或子查询
说明:若两列值相等,此逻辑会优先返回Rank_A;若需要优先返回Rank_B,可调整判断条件为WHEN Rank_B < Rank_A THEN 'Rank_B' ELSE 'Rank_A'。
方法2:使用数组函数适配多列场景
如果后续需要处理3列及以上的情况,可通过Snowflake数组函数实现通用方案:
SELECT Rank_A, Rank_B, LEAST(Rank_A, Rank_B) AS LEAST, ARRAY_CONSTRUCT('Rank_A', 'Rank_B')[ARRAY_POSITION(ARRAY_CONSTRUCT(Rank_A, Rank_B), LEAST(Rank_A, Rank_B)) - 1] AS "Column Name of Least Value" FROM your_table; -- 替换为你的表名或子查询
说明:
ARRAY_CONSTRUCT(Rank_A, Rank_B)生成当前行的数值数组ARRAY_POSITION定位最小值在数组中的位置(Snowflake数组索引从1开始,需减1适配列名数组的0起始索引)- 通过列名数组
ARRAY_CONSTRUCT('Rank_A', 'Rank_B')获取对应列名
此方法无需修改判断逻辑,仅需扩展数组中的列名和列值即可适配更多列的场景。
内容的提问来源于stack exchange,提问作者gpak
相关产品推荐
相关产品推荐

