Функция BigQuery для сохранения значений

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

Каков наилучший способ сохранения значения в BigQuery? Например, если значение в ячейке равно (none) , то оно должно получить последнее известное значение, которое не является (none) , но если значение затем изменится, начните сохранять это значение. Смотрите ниже пример того, что я хотел бы. Я пытался использовать функцию ЗАДЕРЖКИ, но она работает только для одной строки.

 Row      Value      Persisted
1        Apple      Apple
2        (none)     Apple
3        (none)     Apple
4        (none)     Apple
5        Orange     Orange
6        (none)     Orange
  

Ответ №1:

Ниже приведен стандартный SQL BigQuery

Для достижения вашей цели вам понадобится некоторое дополнительное поле в ваших данных, которое будет определять порядок ваших значений — обычно это столбец с меткой времени, датой и т.д. тип данных или номер, отражающий позицию. В приведенном ниже примере я использую ts в качестве такого столбца

 #standardSQL
SELECT ts, value, 
  LAST_VALUE(IF(value = '(none)', NULL, value) IGNORE NULLS) OVER(ORDER BY ts) Persisted
FROM `project.dataset.table`  
  

Вы можете протестировать, поиграть с приведенными выше примерами данных из вашего вопроса, как в примере ниже

 #standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 ts, 'Apple' Value UNION ALL
  SELECT 2, '(none)' UNION ALL
  SELECT 3, '(none)' UNION ALL
  SELECT 4, '(none)' UNION ALL
  SELECT 5, 'Orange' UNION ALL
  SELECT 6, '(none)'  
)
SELECT ts, value, 
  LAST_VALUE(IF(value = '(none)', NULL, value) IGNORE NULLS) OVER(ORDER BY ts) Persisted
FROM `project.dataset.table`
  

с выводом

 Row ts  value   Persisted    
1   1   Apple   Apple    
2   2   (none)  Apple    
3   3   (none)  Apple    
4   4   (none)  Apple    
5   5   Orange  Orange   
6   6   (none)  Orange