Как выбрать несколько столбцов для условия с помощью одного оператора where?

Я делаю обнаружение выбросов для вычислений на разных временных горизонтах.

Как я могу убрать следующее в 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)

Каковы значения "measure_xx_sec"? Если это так, как следует из названия, наверняка вам просто нужно (ожидаемое_значение * 100)> measure_10_sec?

Barry Piccinni 10.08.2018 14:57

@BarryPiccinni - Это не сработает. Возможно, другие показатели являются выбросами, а measure_10_sec - нет.

Scott Skiles 10.08.2018 15:12
1
2
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать 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)
...

Примечание: я не уверен, поддерживает ли ваша СУБД SELECT без синтаксиса FROM. Документация предлагает это, но вам, вероятно, потребуется найти другой подзапрос для получения значений.

Ответ принят как подходящий

Просто используйте 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().

Идеальный. Спасибо.

Scott Skiles 10.08.2018 15:18

Другие вопросы по теме