Мне нужно запросить большую таблицу BigQuery, чтобы получить данные о штрих-кодах в магазине за определенные даты. Для каждого из этих штрих-кодов указана дата (для каждого штрих-кода в таблице BigQuery есть тысячи дат, что делает непрактичным запрос только по штрих-коду). Поэтому я создал список кортежей, содержащих штрих-коды и конкретные даты (только очень небольшое подмножество):
date_and_barcode = [('A4630411929016393', datetime.date(2022, 10, 9)),
('A4630411929716390', datetime.date(2022, 10, 9)),
('A4630462735016271', datetime.date(2022, 10, 9)),
('A4070460677116273', datetime.date(2022, 10, 9)),
('A4070460701616276', datetime.date(2022, 10, 9)),
('A4630460194116279', datetime.date(2022, 10, 9)),
('A4630460205516276', datetime.date(2022, 10, 7)),
('A4630460214016271', datetime.date(2022, 10, 9)),
('A4630460280316277', datetime.date(2022, 10, 9)),
('A4630460281616271', datetime.date(2022, 10, 9)),
('A4630450353216276', datetime.date(2022, 10, 11)),
('A4220452268816274', datetime.date(2022, 10, 9))]
Мой запрос сегодня выглядит так:
query="""
select barcode,
storeinfo1,
storeinfo2,
item1
from `project.dataset.table`
where barcode IN UNNEST(@label_list) and date in UNNEST(@date_list)
"""
job_config = bigquery.QueryJobConfig(
query_parameters=[
bigquery.ArrayQueryParameter("label_list", "STRING", label_list),
bigquery.ArrayQueryParameter("date_list", "STRING", date_list),
]
)
DATA = client.query(query, job_config=job_config).to_dataframe()
Очевидно, что это не работает, так как потребуются все возможные комбинации штрих-кодов и дат. Мне нужны только те комбинации, которые соответствуют тому списку, который у меня есть.
я пробовал это
query="""
select barcode,
storeinfo1,
storeinfo2,
item1
from `project.dataset.table`
where barcode in {} and Date in {}
)
""".format(UNNEST(date_and_barcode)[0], UNNEST(date_and_barcode)[1])
job_config = bigquery.QueryJobConfig(
query_parameters=[
bigquery.ArrayQueryParameter("date_and_barcode", "STRING", date_and_barcode),
]
)
DATA = client.query(query, job_config=job_config).to_dataframe()
и
query="""
select barcode,
storeinfo1,
storeinfo2,
item1
from `project.dataset.table`
where barcode in UNNEST(@{}) and Date in UNNEST(@{})
)
""".format(list(zip(*date_and_labels))[0], list(zip(*date_and_labels))[1])
job_config = bigquery.QueryJobConfig(
query_parameters=[
bigquery.ArrayQueryParameter("date_and_barcode", "STRING", date_and_barcode),
]
)
DATA = client.query(query, job_config=job_config).to_dataframe()
Ни один не работал!
Буду признателен за подсказку как это решить.
Вы можете использовать синтаксис кортежа в своем запросе.
(штрих-код, дата) IN UNNEST(дата_и_штрих-код)
DECLARE date_and_barcode DEFAULT [('A4630411929016393', date(2022, 10, 9)),
('A4630411929716390', date(2022, 10, 9)),
('A4630462735016271', date(2022, 10, 9)),
('A4070460677116273', date(2022, 10, 9)),
('A4070460701616276', date(2022, 10, 9)),
('A4630460194116279', date(2022, 10, 9)),
('A4630460205516276', date(2022, 10, 7)),
('A4630460214016271', date(2022, 10, 9)),
('A4630460280316277', date(2022, 10, 9)),
('A4630460281616271', date(2022, 10, 9)),
('A4630450353216276', date(2022, 10, 11)),
('A4220452268816274', date(2022, 10, 9))];
WITH sample_data AS (
SELECT 'A4630460194116279' barcode, DATE '2022-10-09' date
)
SELECT * FROM sample_data WHERE (barcode, date) IN UNNEST(date_and_barcode);
Результаты запроса
Пример Python
date_and_barcode = [('A4630411929016393', datetime.date(2022, 10, 9)),
('A4630411929716390', datetime.date(2022, 10, 9)),
# ... same as list of tuples in your question
('A4630450353216276', datetime.date(2022, 10, 11)),
('A4220452268816274', datetime.date(2022, 10, 9))
]
date_and_barcode = ",".join("('%s','%s')" % tup for tup in date_and_barcode)
query=f"""
select barcode,
storeinfo1,
storeinfo2,
item1
from `project.dataset.table`
where (barcode, date) IN UNNEST([{date_and_barcode}])
"""
print(query)
@SergedeGossondeVarennes, date_and_barcode
хранятся в другой таблице в вашем реальном наборе данных?
Они хранятся в списке, созданном до запроса
Если список невелик и вы хотите выполнить запрос в одном выражении, вы можете рассмотреть обновленный мной код Python.
или это может быть полезно, если вы хотите получить результат от сценария BigQuery, который состоит из нескольких операторов. stackoverflow.com/questions/59806304/…
Это работает как шарм. Но... при запуске в BQ он создает два результата запроса. Один для декларации, другой для фактических результатов. Вы знаете, как получить доступ только к результатам. Я работаю в питоне.