#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