【问题标题】:Bigquery Standard Sql equivalent to LAST() from Legacy SqlBigquery Standard Sql 等效于 Legacy Sql 中的 LAST()
【发布时间】:2017-10-19 22:36:03
【问题描述】:

我有一个带有 id 和 name 的表

id  | name
----------
1   |  apple
1   |  banana
2   |  carrot
3   |  lemon
3   |  orange

在 Legacy Sql 中,可以编写如下语句

SELECT
    id,
    LAST(name) AS last_record_of_name,
FROM
  [project:table]
GROUP BY 1

结果是

id  | last_record_of_name
----------
1   |  banana
2   |  carrot
3   |  orange

这利用了函数 LAST https://cloud.google.com/bigquery/docs/reference/legacy-sql#last

如果在 BigQuery 中使用标准 sql,是否有类似的功能?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    关于旧版 SQL 的 LAST 的问题是,对于您给出的示例,输出是未定义的;它没有指定在这种情况下如何确定“最后一个”,因为不保证输入表扫描具有任何特定顺序。如所写,您可以使用 BigQuery 中标准 SQL 中的 ANY_VALUE 表达相同的查询,例如:

    WITH SampleInput AS (
      SELECT 1 AS id, 'apple' AS name UNION ALL
      SELECT 1, 'banana' UNION ALL
      SELECT 2, 'carrot' UNION ALL
      SELECT 3, 'lemon' UNION ALL
      SELECT 3, 'orange'
    )
    SELECT
      id,
      ANY_VALUE(name) AS last_record_of_name
    FROM SampleInput
    GROUP BY id;
    +----+---------------------+
    | id | last_record_of_name |
    +----+---------------------+
    | 1  | apple               |
    | 2  | carrot              |
    | 3  | lemon               |
    +----+---------------------+
    

    不过,我认为这不是你所追求的;如果目标是根据某些条件(例如 name 值的排序顺序)获取“最后一个”值,则可以将 ARRAY_AGGORDER BYLIMIT 1 一起使用,例如:

    WITH SampleInput AS (
      SELECT 1 AS id, 'apple' AS name UNION ALL
      SELECT 1, 'banana' UNION ALL
      SELECT 2, 'carrot' UNION ALL
      SELECT 3, 'lemon' UNION ALL
      SELECT 3, 'orange'
    )
    SELECT
      id,
      ARRAY_AGG(name ORDER BY name DESC LIMIT 1)[OFFSET(0)] AS last_record_of_name
    FROM SampleInput
    GROUP BY id;
    +----+---------------------+
    | id | last_record_of_name |
    +----+---------------------+
    | 1  | banana              |
    | 2  | carrot              |
    | 3  | orange              |
    +----+---------------------+
    

    查询的行为是明确定义的,它会根据您的示例输入和输出给出所需的结果。

    【讨论】:

      【解决方案2】:

      Array_Agg() 与 Python BigQuery 的工作解决方案:

      !pip install -U google-cloud-bigquery

      将熊猫导入为 pd

      从 google.cloud 导入 bigquery

      strvalue = """选择用户 ARRAY_AGG(STRUCT(session, page)) 作为 hasComp 来自<datasetname>.<tableName> 哪里 按用户分组 按用户排序 限制 100 """

      bigquery_client = bigquery.Client(project="")

      数据集 = bigquery_client.dataset("")

      table = dataset.table('')

      table.view_query_legacy_sql = False

      query_job = bigquery_client.query(str_value)

      df = query_job.to_dataframe()

      打印(df)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        • 2017-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多