Как я могу обновить массово, не выполняя построчно каждый оператор обновления для каждой группы условий - PullRequest
0 голосов
/ 19 июня 2020

sample data Теперь у меня есть таблица. Я хочу обновить таблицу, где каждая строка соответствует примерно этому

UPDATE internal.temorary_check SET monday = 1, tuesday = 2, где ID_recipient = 23771085 и час даты действия = 1; ОБНОВЛЕНИЕ internal.temorary_check УСТАНОВИТЬ понедельник = 4, вторник = 7, где ID_recipient = 23771085 и час даты действия = 3;

ОБНОВЛЕНИЕ internal.temorary_check УСТАНОВИТЬ понедельник = 7, вторник = 1, где ID_recipient = 32243506 и час даты действия = 1; и так далее

Есть ли способ сделать это массово или используя что-то вроде массива

UPDATE internal.temorary_check SET monday = [4,7,3], tuesday = [2, 7,1], где ID_recipient в (23771085,23771085,3224432) и час даты действия в (3,1,2);

Будет 100 групп по python и конкатенация строк, которую мне нужно создать правильный скрипт.

1 Ответ

1 голос
/ 19 июня 2020

Ниже приведено описание BigQuery Standard SQL

#standardSQL
UPDATE `internal.temorary_check`
SET monday = set_value.mon, tuesday = set_value.tue
FROM (
  SELECT [
    STRUCT(STRUCT(23771085 AS id, 1 AS hour) AS lookup_value, STRUCT(1 AS mon, 2 AS tue) AS set_value),
    ((23771085, 3), (4, 7)),
    ((32243506, 1), (7, 1))
  ] x
) dict, UNNEST(x) y 
WHERE (ID_recipient, action_date_hour) = lookup_value

Как видите, вы можете поместить все свои сценарии ios в dict, а затем использовать его как поиск и установить значения. Очевидно, вам нужно будет расширить структуру set_value и список dicts. Вы также можете сначала создать таблицу dict со всеми этими значениями, и в этом случае оператор обновления превратится в очень простой и управляемый оператор

#standardSQL
UPDATE `internal.temorary_check`
SET monday = set_value.mon, tuesday = set_value.tue
FROM dict, UNNEST(x) y 
WHERE (ID_recipient, action_date_hour) = lookup_value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...