【问题标题】:Passing tuples to SQL query while unnesting取消嵌套时将元组传递给 SQL 查询
【发布时间】:2022-11-21 18:08:00
【问题描述】:

我需要查询一个大型 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()

没有工作!

我将不胜感激有关如何解决此问题的提示。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    您可以考虑在查询中使用 tuple syntax

    (条形码, 日期) IN UNNEST(date_and_barcode)

    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);
    

    查询结果

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 2019-04-06
      • 2014-09-11
      • 2017-03-23
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多