Краткий ответ: нет, заказ не гарантированно поддерживается.
Длинный ответ: на практике вы, скорее всего, увидите, что заказ поддерживается, но вы не должны зависеть от него.Приведенный вами пример похож на запрос этого типа:
SELECT *
FROM (
SELECT 3 AS x UNION ALL
SELECT 2 UNION ALL
SELECT 1
ORDER BY x
)
Каков ожидаемый порядок вывода?ORDER BY
находится в подзапросе, и внешний запрос не налагает никакого упорядочения, поэтому BigQuery (или любой другой движок, на котором вы его запускаете) может свободно переупорядочивать строки в выводе по своему усмотрению.Вы можете получить обратно 1, 2, 3
, или вы можете получить 3, 2, 1
или любой другой заказ.Более общий принцип заключается в том, что проекции не сохраняют порядок.
Хотя массивы имеют четко определенный порядок своих элементов, когда вы используете функцию UNNEST
, вы конвертируете массив в отношение,который не имеет четко определенного порядка, если вы не используете ORDER BY
.Например, рассмотрим этот запрос:
SELECT ARRAY(SELECT x + 1 FROM UNNEST(arr) AS x) AS new_arr
FROM (SELECT [1, 2, 3] AS arr)
Массив new_arr
фактически не гарантирует наличие элементов [2, 3, 4]
в этом порядке, так как запрос внутри функции ARRAY
не используетORDER BY
.Вы можете справиться с этим недетерминизмом, упорядочив на основе смещения элементов, однако:
SELECT ARRAY(SELECT x + 1 FROM UNNEST(arr) AS x WITH OFFSET ORDER BY OFFSET) AS new_arr
FROM (SELECT [1, 2, 3] AS arr)
Теперь гарантированно получится [2, 3, 4]
.
Возвращаясь к исходному вопросу,вы можете убедиться, что вы получаете детерминированный вывод, установив порядок в подзапросе, который вычисляет номера строк:
ranked_predictions AS (
SELECT
id,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY OFFSET) AS rownum,
DENSE_RANK() OVER (PARTITION BY id ORDER BY flattened_prediction DESC) AS array_rank
FROM
predictions P
CROSS JOIN
UNNEST(P.prediction) AS flattened_prediction WITH OFFSET
)
Я добавил WITH OFFSET
после UNNEST
и ORDER BY OFFSET
внутри ROW_NUMBER
окно, чтобы гарантировать, что номера строк вычисляются на основе исходного порядка элементов массива.