如何使用单个where语句为条件选择多个列?

时间:2018-08-10 12:52:31

标签: sql vertica

我正在做一些离群值检测,以便在不同的时间范围内进行计算。

如何在Vertica SQL中清理以下内容?

Select * FROM my_table
WHERE (    
         (expected_value * 100) > measure_10_sec 
      OR (expected_value * 100) > measure_20_sec
      OR (expected_value * 100) > measure_30_sec
      OR (expected_value * 100) > measure_40_sec
      OR (expected_value * 100) > measure_50_sec
      OR (expected_value * 100) > measure_60_sec
)

对于这样一个更漂亮的查询:

Select * FROM my_table
WHERE (expected_value* 100) > (measure_10_sec, measure_20_sec, measure_30_sec, measure_40_sec, measure_50_sec, measure_60_sec)

2 个答案:

答案 0 :(得分:3)

只需使用LEAST()

select * 
from my_table
where (expected_value * 100) > least(measure_10_sec, measure_20_sec, measure_30_sec, measure_40_sec, measure_50_sec, measure_60_sec)

如果expected_value * 100大于一个值,则大于最小的值。

注意:这里假设所有措施都不是{NULL

如果使用AND代替OR,那么您将使用GREATEST()

答案 1 :(得分:1)

您可以使用ANY检查子查询中左运算符是否满足任何右运算符的要求。

...
WHERE expected_value * 100 > ANY(SELECT measure_10_sec
                                 UNION ALL
                                 SELECT measure_20_sec
                                 ...
                                 UNION ALL
                                 SELECT measure_50_sec
                                 UNION ALL
                                 SELECT measure_60_sec)
...

注意:我不确定您的DBMS是否支持不带SELECT语法的FROM。文档提出了建议,但是您可能需要找到另一个子查询来获取值。