Я рассматривал использование LAG()
для возврата значения из предыдущей строки в ARRAY of STRUCT
, и похоже, что функции окна навигации, такие как LAG/LEAD
, не поддерживаются с UNNEST
.
Это звучит неоптимально, но вам нужно UNNEST
все и (ре) PARTITION BY
!!
Например, вы хотите указать сумму предыдущей строки:
РЕДАКТИРОВАТЬ : Подробности схемы:
Схема счетов: docID STRING, lines STRUCT<lineID STRING, amount NUMERIC>
Ожидаемый результат: docID STRING, lines STRUCT<lineID STRING, amount NUMERIC, prev_amount NUMERIC>
SELECT
docID, lineID, amount
,LAG(amount) OVER (PARTITION BY docID ORDER by lineID) prev_amount
FROM invoices, UNNEST(lines)
Thisдовольно медленноЯ хотел бы, чтобы мы могли как-то передать массив как оконную раму для использования.
Любая альтернатива? Я использую BigQuery
, но это может относиться к другим СУБД.
ОБНОВЛЕНИЕ : Я пришелс альтернативой ниже, используя WITH OFFSET
.Быстрее, и, возможно, это то, для чего предназначен OFFSET, он просто уродлив и может показаться мне более простым.
SELECT
docID, lineID, amount
,(SELECT amount FROM UNNEST(lines) WITH OFFSET AS pos2 WHERE pos2 = pos - 1) prev_amount
FROM invoices, UNNEST(lines) WITH OFFSET AS pos