Window Functions уже достаточно изящный, чтобы выразить в SQL свою бизнес-логику. Хотя кажется, что вам нужно повторить часть PARTITION BY ... ORDER BY ...
для каждого соответствующего поля вывода инструкции SELECT, я лично не думаю, что это большая цена за власть, которую предоставляют нам функции окна.
Кстати, вы не ограничены использованием только одного PARTITION BY
для всех полей вывода - вы можете использовать любой раздел, который вам нужен для каждого. То же самое для ORDER BY
Оптимизирует ли BigQuery для этого во время выполнения запроса, чтобы сделать его эффективным?
После выполнения запроса вы можете проверить Query Plan Explanation.
Это ясно показывает, что BigQuery повторно использует разделы независимо от того, сколько функций окна вы используете. И выглядит, если у вас есть несколько разных разделов, которые они каскадируют. (это также ясно, если вы видите план запроса)
Есть ли лучший способ сделать это?
Вы можете имитировать функцию окна с разделением - несколькими способами. Ни один из них, похоже, не работает и/или читается/управляется так же хорошо, как при использовании оконных функций.
Например, ниже логика будет давать тот же результат (только логика высокого уровня здесь).
Высылаю ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...) as POS
в исходное данные/таблицу.
Чем вы присоединяетесь к нему с помощью ON a.partition = b.partition AND a.POS = a. (POS + 1) < - это просто логика, а не реализация
Итак, теперь у вас будут все текущие значения в таблице с псевдонимом а и все последующие значения в таблице псевдоним б
Как я уже упоминал выше производит точно такой же результат, как и функции окна, но код выглядит гораздо более уродливые и исполнение показывает гораздо более дорогой
Возможно объединить поля в одно поле, а затем сделать вывод, а затем просто разделить эту строку. – andrewm4894