Как я могу преобразовать строковое поле массива в длинные столбцы целых чисел без повторяющихся полей в BigQuery?

# #google-bigquery

Вопрос:

У меня есть большая таблица запросов в этом формате:

место ежедневные визиты
ааа [3,12,8,7,18,9,0,3,5,2,3,17,12,3,4,5,3,10,10,9,4,2,5,3,4,13,19,1,3,4,4]

Оба столбца являются строками, хотя столбец daily_visits следует рассматривать как массив целых чисел, представляющих количество посещений в день месяца (1-31).

В идеале мне бы хотелось, чтобы вместо этого данные были в этом формате:

место посещения Дата
ааа 3 1
ааа 12 2
ааа 8 3
ааа 7 4

где оба visits и date являются целочисленными полями.

Мне удалось перевести его в формат, в котором посещения хранятся в повторяющихся полях, подобных этому:

место посещения Дата
ааа 3 1
12 2
8 3
7 4

…для чего я использовал этот запутанный запрос:

 SELECT place, [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31] AS date, ARRAY(
  SELECT CAST(integer_element AS INT64)
  FROM `db`, UNNEST(
    JSON_EXTRACT_ARRAY(daily_visits,'

Вопросы:

  1. Может ли мой первоначальный запрос быть лучше? Я чувствую, что мог бы использовать СЧЕТЧИК или СМЕЩЕНИЕ, чтобы помочь пронумеровать даты.
  2. Как я могу сгладить это, чтобы оно не хранилось в повторяющихся полях?
Заранее спасибо.

Ответ №1:

Рассмотрим ниже простой подход

 select place, visits, day   1 as day
from `db`, unnest(daily_visits) visits with offset as day
 

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

введите описание изображения здесь

Комментарии:

1. Спасибо! Вы вывели меня на правильный путь, но я не смог использовать ваш ответ, потому visits что поле хранилось в таблице в виде строки. Сначала мне пришлось преобразовать его в массив, но ваш ответ со СМЕЩЕНИЕМ был невероятно полезен.

2. подумайте о том, чтобы проголосовать (по крайней мере) - в то же время - я думаю, вы можете принять это - потому что оно основано на том, что вы предоставили, и способ его корректировки - чрезвычайно прост - просто сделайте unnest(split(daily_visits)) вместо unnest(daily_visits) этого ! :o) Я могу обновить свой ответ, если вы хотите! дай мне знать!

Ответ №2:

С помощью @Михаила Берлянта я смог разработать этот запрос, который извлек массив, а также дал мне необходимые столбцы:

 SELECT place, 
CAST(visit_integer_array AS INT64) AS visits, 
day   1 AS day
FROM `db`,  
UNNEST(JSON_EXTRACT_ARRAY(visits,'



)
) AS integer_element
) AS visits
FROM `db`

Вопросы:

  1. Может ли мой первоначальный запрос быть лучше? Я чувствую, что мог бы использовать СЧЕТЧИК или СМЕЩЕНИЕ, чтобы помочь пронумеровать даты.
  2. Как я могу сгладить это, чтобы оно не хранилось в повторяющихся полях?

Заранее спасибо.

Ответ №1:

Рассмотрим ниже простой подход


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

введите описание изображения здесь

Комментарии:

1. Спасибо! Вы вывели меня на правильный путь, но я не смог использовать ваш ответ, потому visits что поле хранилось в таблице в виде строки. Сначала мне пришлось преобразовать его в массив, но ваш ответ со СМЕЩЕНИЕМ был невероятно полезен.

2. подумайте о том, чтобы проголосовать (по крайней мере) - в то же время - я думаю, вы можете принять это - потому что оно основано на том, что вы предоставили, и способ его корректировки - чрезвычайно прост - просто сделайте unnest(split(daily_visits)) вместо unnest(daily_visits) этого ! :o) Я могу обновить свой ответ, если вы хотите! дай мне знать!

Ответ №2:

С помощью @Михаила Берлянта я смог разработать этот запрос, который извлек массив, а также дал мне необходимые столбцы:


) ) AS visit_integer_array
WITH OFFSET AS day

)
) AS integer_element
) AS visits
FROM `db`

Вопросы:

  1. Может ли мой первоначальный запрос быть лучше? Я чувствую, что мог бы использовать СЧЕТЧИК или СМЕЩЕНИЕ, чтобы помочь пронумеровать даты.
  2. Как я могу сгладить это, чтобы оно не хранилось в повторяющихся полях?

Заранее спасибо.

Ответ №1:

Рассмотрим ниже простой подход


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

введите описание изображения здесь

Комментарии:

1. Спасибо! Вы вывели меня на правильный путь, но я не смог использовать ваш ответ, потому visits что поле хранилось в таблице в виде строки. Сначала мне пришлось преобразовать его в массив, но ваш ответ со СМЕЩЕНИЕМ был невероятно полезен.

2. подумайте о том, чтобы проголосовать (по крайней мере) — в то же время — я думаю, вы можете принять это — потому что оно основано на том, что вы предоставили, и способ его корректировки — чрезвычайно прост — просто сделайте unnest(split(daily_visits)) вместо unnest(daily_visits) этого ! :o) Я могу обновить свой ответ, если вы хотите! дай мне знать!

Ответ №2:

С помощью @Михаила Берлянта я смог разработать этот запрос, который извлек массив, а также дал мне необходимые столбцы: