代码之家  ›  专栏  ›  技术社区  ›  Scott Skiles

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

  •  1
  • Scott Skiles  · 技术社区  · 6 年前

    我正在对不同时间范围内的计算进行异常值检测。

    如何在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 回复  |  直到 6 年前
        1
  •  3
  •   Gordon Linoff    6 年前

    只是使用 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() .

        2
  •  1
  •   sticky bit    6 年前

    你可以用 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 语法。文档表明了这一点,但是您可能需要找到另一个子查询来获取这些值。