max_by с несколькими возвращаемыми столбцами - PullRequest
0 голосов
/ 31 мая 2019

Документация Presto гласит: max_by(x, y) возвращает значение x, связанное с максимальным значением y, по всем входным значениям.(https://prestodb.github.io/docs/current/functions/aggregate.html#max_by)

Как вернуть несколько столбцов (не только x), связанных с максимальным y? Я обнаружил, что max_by((x1, x2, x3), y) работает (почти), но возвращает один столбец с x1, x2, x3 иЯ не знаю, как преобразовать его в несколько столбцов.

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Начиная с Presto 314 , теперь можно ссылаться на поля ROW с помощью оператора [].

SELECT r[1], r[2], r[3]
FROM (
   SELECT max_by((x1, x2, x3), y) r
   FROM (...) t(y, x1, x2, x3)
)
0 голосов
/ 31 мая 2019

Начиная с Presto 314

Как отметил Мартин Траверсо, с Presto 314 есть лучший вариант - оператор индекса [].См. Ответ Мартина.

Для более старых версий см. Ниже

(x1, x2, x3) создает row с анонимными полями.В настоящее время для доступа к отдельным полям строки необходимо преобразовать значение в строку с именованными полями :

CAST(row_value AS row(some_field field_type, other_field, field_type, ...))

В запросе это может быть внутри max_by или снаружи (нене имеет значения).Пример:

presto> SELECT r.afield, r.bfield, r.cfield
     -> FROM (
     ->     SELECT max_by(CAST((x1, x2, x3) AS row(afield integer, bfield varchar, cfield double)), y) r
     ->     FROM (VALUES (1, 42, 'a', 13e0), (2, 40, 'b', 77e0)) t(y, x1, x2, x3)
     -> );
 afield | bfield | cfield
--------+--------+--------
     40 | b      |   77.0
(1 row)

Я понимаю, что это довольно многословно.Есть проблема, чтобы сделать это более удобным: https://github.com/prestosql/presto/issues/860.

...