Как выбрать ключ, соответствующий наибольшему значению на карте гистограммы? - PullRequest
0 голосов
/ 25 февраля 2019

Я использую функцию histogram() https://prestodb.github.io/docs/current/functions/aggregate.html

Это «Возвращает карту, содержащую количество раз, которое встречается при каждом входном значении.»

Результат может выглядетьчто-то вроде этого:

{ORANGES=1, APPLES=165, BANANAS=1}

Есть ли функция, которая будет возвращать APPLES с учетом вышеуказанного ввода?

XY Проблема?

проницательный читатель может заметить, что конечный результат histogram() в сочетании с тем, что я пытаюсь сделать, будет эквивалентен мифической функции Mode , которая существует в учебниках, но отсутствует в реальных движках баз данных.

Вот мой полный запрос на данный момент.Я ищу наиболее часто встречающееся значение upper(cmplx) для каждого upper(address),zip набора:

select * from (select upper(address) as address, zip, 
               (SELECT max_by(key, value) 
                FROM unnest(histogram(upper(cmplx))) as t(key, value)),
               count(*) as N
from apartments 
group by upper(address), zip) t1
where N > 3
order by N desc;

И ошибку ...

SYNTAX_ERROR: строка 2:55: Выражение константы не может содержать ссылки на столбцы

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете преобразовать map, полученный из histogram, в массив с map_entries .Затем вы можете UNNEST этот массив в отношении, и вы можете позвонить max_by .Пожалуйста, смотрите приведенный ниже пример:

SELECT max_by(key, value) FROM (
    SELECT map_entries(histogram(clerk)) as entries from tpch.tiny.orders
)
CROSS JOIN UNNEST (entries) t(key, value);

РЕДАКТИРОВАТЬ:

Как отмечает @Alex R, вы также можете перенаправить histogram результаты в UNNEST:

SELECT max_by(key, value) FROM ( 
    SELECT histogram(clerk) as histogram from tpch.tiny.orders ) 
CROSS JOIN UNNEST (histogram) t(key, value);

В вашем вопросе часть запроса (SELECT max_by(key, value) FROM unnest(histogram(upper(cmplx)) является коррелированным подзапросом, который еще не поддерживается.Однако ошибка, которую вы видите, вводит в заблуждение.IIRC Athena использует Presto 0.172, и это сообщение об ошибке было исправлено в 0.183 (см. https://docs.starburstdata.com/latest/release/release-0.183.html - это было в июле 2017 года, кстати, * 0.122 * также было добавлено в 0.183)

...