在Snowflake中如何从N列获取每行的非空最小值?
忽略NULL值获取行内最小值的解决方案
针对你遇到的SMALLEST函数因NULL值返回NULL的问题,不同数据库有不同的处理方式,以下是几种常见数据库的实现方案:
MySQL/MariaDB
MySQL的LEAST函数只要参数中有NULL就会返回NULL,因此需要用IFNULL将NULL替换为一个远大于实际数据的极大值,确保它不会影响最小值的计算:
SELECT ID, Col1, Col2, Col3, Col4, LEAST( IFNULL(Col1, 999999999), IFNULL(Col2, 999999999), IFNULL(Col3, 999999999), IFNULL(Col4, 999999999) ) AS ExpectedOutput FROM your_table;
注意:极大值的选择要根据你实际数据的范围调整,避免和真实数据冲突。
PostgreSQL
PostgreSQL的LEAST函数会自动忽略NULL值(仅当所有参数都是NULL时才返回NULL),直接使用即可:
SELECT ID, Col1, Col2, Col3, Col4, LEAST(Col1, Col2, Col3, Col4) AS ExpectedOutput FROM your_table;
SQL Server
SQL Server没有内置的LEAST函数,可以通过将列转为行数据,再取最小值的方式实现:
SELECT ID, Col1, Col2, Col3, Col4, (SELECT MIN(val) FROM (VALUES (Col1), (Col2), (Col3), (Col4)) AS temp(val)) AS ExpectedOutput FROM your_table;
通用方案(适用于所有数据库)
如果列数较少,也可以用CASE表达式逐个判断,逻辑清晰但扩展性差:
SELECT ID, Col1, Col2, Col3, Col4, CASE WHEN Col1 IS NOT NULL AND (Col2 IS NULL OR Col1 <= Col2) AND (Col3 IS NULL OR Col1 <= Col3) AND (Col4 IS NULL OR Col1 <= Col4) THEN Col1 WHEN Col2 IS NOT NULL AND (Col3 IS NULL OR Col2 <= Col3) AND (Col4 IS NULL OR Col2 <= Col4) THEN Col2 WHEN Col3 IS NOT NULL AND (Col4 IS NULL OR Col3 <= Col4) THEN Col3 ELSE Col4 END AS ExpectedOutput FROM your_table;
内容的提问来源于stack exchange,提问作者jeena p
相关产品推荐
相关产品推荐

