Использование Hive ntile приводит к предложению where

Я хочу получить сводные данные первого квартиля для таблицы в Hive. Ниже приведен запрос для получения максимального количества просмотров в каждом квартиле:

SELECT NTILE(4) OVER (ORDER BY total_views) AS quartile, MAX(total_views)
FROM view_data
GROUP BY quartile
ORDER BY quartile;

И этот запрос должен получить имена всех людей, которые находятся в первом квартиле:

SELECT name, NTILE(4) OVER (ORDER BY total_views) AS quartile
FROM view_data
WHERE quartile = 1

Я получаю эту ошибку для обоих запросов:

Invalid table alias or column reference 'quartile'

Как я могу сослаться на результаты ntile в предложении where или group by?


person Nadine    schedule 21.07.2015    source источник


Ответы (2)


Вы не можете поместить оконную функцию в предложение where, потому что это создаст неоднозначность, если есть составные предикаты. Поэтому используйте подзапрос.

select quartile, max(total_views) from
(SELECT total_views, NTILE(4) OVER (ORDER BY total_views) AS quartile,
FROM view_data) t
GROUP BY quartile
ORDER BY quartile
;

а также

select * from 
(SELECT name, NTILE(4) OVER (ORDER BY total_views) AS quartile
FROM view_data) t
WHERE quartile = 1
;
person invoketheshell    schedule 21.07.2015
comment
Я не очень понимаю, что вы подразумеваете под двусмысленностью, вызванной составными предикатами, не могли бы вы привести пример, пожалуйста? - person Nadine; 21.07.2015
comment
SELECT col1 FROM T1 WHERE ROW_NUMBER() OVER (ORDER BY col1) ‹= 3 AND col1 › '100' Каков будет здесь порядок операций? Должна ли сначала выполняться часть предиката col1 › '100' или нумерация строк. - person invoketheshell; 21.07.2015

Оператор WHERE в SQL может выбирать только существующий столбец в схеме таблицы. Чтобы выполнить эту функцию в вычисляемом столбце, используйте HAVING вместо WHERE.

SELECT name, NTILE(4) OVER (ORDER BY total_views) AS quartile
FROM view_data
HAVING quartile = 1
person solv6868    schedule 01.06.2018
comment
Этот ответ также приводит к ошибке. Пожалуйста, смотрите принятый ответ. - person Nadine; 12.06.2018