строчку, например, arraySort(groupArray(*))?
А в чем проблема
Вот, например: SELECT groupArray(*) over (PARTITION BY user_id ORDER BY rank ROWS BETWEEN UNBOUNDED PRECEDING and 1 PRECEDING) FROM ****; Работает без проблем. Но, SELECT arrayReverse(groupArray(*)) over (PARTITION BY user_id ORDER BY rank ROWS BETWEEN UNBOUNDED PRECEDING and 1 PRECEDING) FROM ****; Ругается: ``` Code: 215. DB::Exception: Column user_id is not under aggregate function and not in GROUP BY: While processing arrayReverse(groupArray(***)) OVER (PARTITION BY user_id ORDER BY rank ASC Rows BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING). (NOT_AN_AGGREGATE) (version 22.2.2.1) ```
Ну так это вопрос к оконным функциям, а не к агрегатным https://github.com/ClickHouse/ClickHouse/issues/19857
да, наверно ты прав... просто, казалось, что это проблема именно агрегатным.... Обязательно вернусь, если что-то другое обнаружу
Тогда вам нужно в подзапрос уносить А вообще arrayReverse(groupArray(*)) Выглядит жутковато, а вам зачем такое надо?
>Тогда вам нужно в подзапрос уносить Да, запрос становится ужасным... > а вам зачем такое надо? Это был пример
Вообще, формулировка в баге некорректная. не aggregate over window, а window over aggregate. А на деле вообще ни то, ни то. Window точно нельзя агрегировать. window считается поверх результата запроса и над ним можно делать только эм.. не знаю как сказать. map преобразования. т.е. нельзя агрегировать поле window, по нему нельзя фильтровать, нельзя делать window поверх window и прочее. только через подзапрос. Но обычно можно делать любые арифметические преобразованияю, всякие case, if, операции сравнения. Здесь же, похоже, не реализован этот шаг с вычислениями, т.е. window не может быть участником других операций (я смотрю на версии 21.8), так что через подзапрос. Но даже не в реализации дело, похоже, а в алиасах. В этом плане клик очень либеральный и позволяет крутить алиасы как угодно. и где-то здесь возникает затык. Само выражение окна не попадает в результирующий список столбцов. И на этом конец. Вот это работает корректно SELECT sum(sum(number)) OVER (PARTITION BY (number % 10)) FROM numbers(10000) GROUP BY number % 10 SETTINGS allow_experimental_window_functions = 1 А вот так ругается уже SELECT sum(sum(number)) OVER (PARTITION BY (number % 10)) + 1 FROM numbers(10000) GROUP BY number % 10 SETTINGS allow_experimental_window_functions = 1 Code: 47, e.displayText() = DB::Exception: Unknown identifier: sum(sum(number)) OVER (PARTITION BY number % 10); there are columns: modulo(number, 10), sum(number): While processing sum(sum(number)) OVER (PARTITION BY (number % 10)) + 1 (version 21.8.15.15.altinitystable (altinity build)) Кажется, что это могут пофиксить, если еще не пофиксили, в следующих релизах. Никакого криминала. При этом в постгрес можно написать вот так и все ок. SELECT sum(number)/ (sum(sum(number)) OVER (PARTITION BY (number % 10))) from generate_series(1, 10) as number GROUP BY number % 10
Обсуждают сегодня