# #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:
Рассмотрим ниже простой подход
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:
Комментарии:
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:
Комментарии:
1. Спасибо! Вы вывели меня на правильный путь, но я не смог использовать ваш ответ, потому
visits
что поле хранилось в таблице в виде строки. Сначала мне пришлось преобразовать его в массив, но ваш ответ со СМЕЩЕНИЕМ был невероятно полезен.2. подумайте о том, чтобы проголосовать (по крайней мере) — в то же время — я думаю, вы можете принять это — потому что оно основано на том, что вы предоставили, и способ его корректировки — чрезвычайно прост — просто сделайте
unnest(split(daily_visits))
вместоunnest(daily_visits)
этого ! :o) Я могу обновить свой ответ, если вы хотите! дай мне знать!
Ответ №2:
С помощью @Михаила Берлянта я смог разработать этот запрос, который извлек массив, а также дал мне необходимые столбцы: