BigQuery - l oop и ссылка на предыдущее значение - PullRequest
1 голос
/ 23 января 2020

У меня есть логика c в каком-то скрипте, который я хочу реализовать с помощью BigQuery. Ниже псевдокод:

// assuming that 'items' is populated from some BQ table
items = ["A", "B", "C", "D", "E"]
var1 = "v1"   //initialize variable
var2 = "v2"   //initialize variable

for item in items
    var1 = var2
    var2 = var1 + item
    print(item, var1, var2)

Вывод:

item  var1      var2
A     v2        v2A
B     v2A       v2AB
C     v2AB      v2ABC
D     v2ABC     v2ABCD
E     v2ABCD    v2ABCDE

Я пытаюсь использовать окно BigQuery и lag () безуспешно до сих пор. Ниже приведен запрос, который я пытаюсь выполнить в BQ:

WITH t AS (SELECT 'A' item UNION ALL
            SELECT 'B' as item UNION ALL
            SELECT 'C' as item UNION ALL
            SELECT 'D' as item UNION ALL
            SELECT 'E' as item)
select item, 
  if (rn = 1, 'v2', lag(concat(var2, item)) over(order by 1)) var1,
  var1 var2
  from (select item, row_number() over() as rn, 'v1' var1, 'v2' var2 from t)

Дайте мне знать, если есть обходной путь.

1 Ответ

2 голосов
/ 23 января 2020

Ниже для BigQuery Standard SQL - чтобы помочь вам начать

#standardSQL
SELECT item, 
  CONCAT('v2', IFNULL(STRING_AGG(item, '') OVER(ORDER BY item ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), '')) var1,
  CONCAT('v2', STRING_AGG(item, '') OVER(ORDER BY item ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) var2
FROM `project.dataset.table`

Если применить к образцу данных из вашего вопроса - как в примере ниже -

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'A' item UNION ALL
  SELECT 'B' AS item UNION ALL
  SELECT 'C' AS item UNION ALL
  SELECT 'D' AS item UNION ALL
  SELECT 'E' AS item
)
SELECT item, 
  CONCAT('v2', IFNULL(STRING_AGG(item, '') OVER(ORDER BY item ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), '')) var1,
  CONCAT('v2', STRING_AGG(item, '') OVER(ORDER BY item ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) var2
FROM `project.dataset.table`
-- ORDER BY item

результат равен

Row     item    var1        var2     
1       A       v2          v2A  
2       B       v2A         v2AB     
3       C       v2AB        v2ABC    
4       D       v2ABC       v2ABCD   
5       E       v2ABCD      v2ABCDE    

С вашими реальными данными у вас, скорее всего, есть какой-то столбец, который вы можете использовать для желаемого упорядочения ваших элементов в выходных переменных - для примера, я просто использовал упорядочение по самим элементам

В качестве варианта вышеприведенного скрипта - вы можете использовать версию ниже

#standardSQL
SELECT item, var1, CONCAT(var1, item) var2 FROM (
  SELECT item, CONCAT('v2', IFNULL(var, '')) var1 FROM (
    SELECT item, 
      STRING_AGG(item, '') OVER(ORDER BY item ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) var
    FROM `project.dataset.table`
  )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...