#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)