предложение «WHERE» с подзапросами в «IN»

#sql #subquery #where-clause #impala

#sql #подзапрос #where-предложение #impala

Вопрос:

Я пытаюсь (на Impala SQL) получить строки, которые имеют наибольшую / наименьшую разницу между двумя столбцами, и я пытаюсь сделать что-то вроде этого:

 SELECT * 
FROM table 
WHERE col1 - col2 IN ( SELECT MAX(col1-col2) 
                       FROM table, SELECT MIN(col1-col2) FROM table )
 
 

Использование только одного подзапроса работает, но если я добавлю их оба внутрь, это выдаст ошибку.

Есть какие-нибудь предложения о том, как я могу это сделать?

Комментарии:

1. Не могли бы вы указать ошибку?

2. Исключение AnalysisException: не поддерживается в предикате с подзапросом:

Ответ №1:

Используйте соединение с подзапросом:

 SELECT * 
FROM table t
JOIN (
  SELECT MIN(col1 - col2) AS min_diff, MAX(col1 - col2) AS max_diff
  FROM table
) AS agg ON t.col1 - t.col2 IN (agg.min_diff, agg.max_diff)
 

Ответ №2:

в вашем случае вы не можете использовать «in» таким образом, что вам нужно объединить его вместе или объединить как список. Я покажу вам несколько примеров

 SELECT * FROM table WHERE  col1 - col2 IN ( SELECT MAX(col1-col2) FROM table  union  SELECT MIN(col1-col2) FROM table)
 

прыгайте, это вам поможет.

Комментарии:

1. Я получаю эту ошибку с помощью UNION: AnalysisException: Подзапрос должен содержать один блок выбора

2. как насчет этого кода, with t1 as (SELECT MAX(col1-col2) col FROM table1 union SELECT MIN(col1-col2) col FROM table1) select * from table1 where col1 - col2 IN (select col from t1)

Ответ №3:

Используйте union следующим образом:

 SELECT * FROM table WHERE col1 - col2 IN ( SELECT MAX(col1-col2) FROM table
  Union
  SELECT MIN(col1-col2) FROM table )
 

— обновить
Используйте rank следующим образом:

 SELECT t.*,
       Rank() over (order by col1 - col2) as rn,
       Rank() over (order by col1 - col2 desc) as rnd
  FROM table t) t
 Where rn = 1 or rnd = 1
 

Комментарии:

1. хорошая идея, но в ней не сказано: AnalysisException: Подзапрос должен содержать один блок выбора

2. Исключение AnalysisException: подзапросы в предикатах OR не поддерживаются

3. Разрешена ли функция window в вашей версии impala? Используйте обновленный раздел.

4. я не могу использовать решение rank, есть синтаксическая ошибка, и я не знаю, что исправить

Ответ №4:

Я предпочту использовать CTE, как показано ниже:

 with difference as
(
    select min(col1-col2) minDifference,max(col1-col2) maxDifference
    from table
)

select *
from table as t
join difference as d
where t.col1-t.col2 in (d.minDifference,d.maxDifference)