Несколько LAG / LEAD с разными смещениями - как избежать дублирования кода - PullRequest
0 голосов
/ 24 февраля 2020

У меня такой запрос:

SELECT
 LAG(col, 1) OVER(w) AS c_1,
 LAG(col, 2) OVER(w) AS c_2,
 ...
 LAG(col, 12) OVER(w) AS c_12,
 other_col,
FROM table
WINDOW w AS (...)

, поэтому много дублирования кода для LAG. Это едва поддается с 12 - 12 месяцами, но как насчет дней (365)? Было бы здорово иметь такую ​​конструкцию, как LAG(col, [1,2,..,365]) OVER(w) AS c_1, c_2, ..., c_365

Есть ли какой-то стандарт или спецификация поставщика c (Google BigQuery, но может быть и другой), способ справиться с этим?

1 Ответ

1 голос
/ 24 февраля 2020

Один из вариантов - поместить результаты в массивы. Это предполагает, что строки для lag() s существуют - т.е. месяцы / дни не пропускаются.

В этом случае что-то вроде этого:

SELECT t.*,
       ARRAY(SELECT el
             FROM unnest(vals) el WITH OFFSET n
             ORDER BY n DESC
             LIMIT 12
            ) ar
FROM (select t.*, array_agg(y) over (partition by id order by x) as vals
      from t
     ) t;

К сожалению, вы не можете использовать LIMIT / ORDER BY с ARRAY_AGG() в качестве оконной функции. Вместо этого это объединяет все вместе, а затем использует операции с массивами для получения последних 12 или 365 или любых других значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...