Передача кортежей в SQL-запрос при распаковке

Мне нужно запросить большую таблицу 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()

Ни один не работал!

Буду признателен за подсказку как это решить.

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
0
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать синтаксис кортежа в своем запросе.

(штрих-код, дата) 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)

Это работает как шарм. Но... при запуске в BQ он создает два результата запроса. Один для декларации, другой для фактических результатов. Вы знаете, как получить доступ только к результатам. Я работаю в питоне.

Serge de Gosson de Varennes 21.11.2022 14:05

@SergedeGossondeVarennes, date_and_barcode хранятся в другой таблице в вашем реальном наборе данных?

Jaytiger 21.11.2022 15:09

Они хранятся в списке, созданном до запроса

Serge de Gosson de Varennes 21.11.2022 15:14

Если список невелик и вы хотите выполнить запрос в одном выражении, вы можете рассмотреть обновленный мной код Python.

Jaytiger 21.11.2022 15:20

или это может быть полезно, если вы хотите получить результат от сценария BigQuery, который состоит из нескольких операторов. stackoverflow.com/questions/59806304/…

Jaytiger 21.11.2022 15:29

Другие вопросы по теме