【问题标题】:BigQuery: Get latest row in a table only if a field has a specific valueBigQuery:仅当字段具有特定值时才获取表中的最新行
【发布时间】:2015-08-12 08:06:22
【问题描述】:

假设我们在 BigQuery 中有一个包含以下数据的表:

ColA | ColB | ColC | ColD
  x  |   y  |  1   |   5
  x  |   y  |  0   |   6
  k  |   z  |  1   |   4

ColA、ColB 为 String,ColC 为 Integer,ColD 时间戳。

我需要获取 ColA 的每个唯一值的最新行 (LAST(ColD))仅当 ColC 等于 1。也就是说,在上表中,查询的结果应该是:

ColA | ColB | ColC | ColD
  k  |   z  |  1   |   4

第 1 行和第 2 行不应包含在结果中,因为对于 ColA=x,表中的最后一个条目(第 2 行)包含 ColC=0

我尝试了使用聚合函数(例如 MAX、LAST)结合子查询的各种查询,但未能达到预期的结果。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    SQL 标准中分析函数的正确名称是FIRST_VALUEFIRST 是 BigQuery 中的聚合函数

    因此,首先您获取按时间戳排序的每个 ColA 的最后一个 ColC

    SELECT
      ColA,
      ColB,
      ColC,
      time,
      FIRST_VALUE(ColC) OVER (PARTITION BY ColA ORDER BY time DESC) AS last_Col_C
    FROM (
      SELECT
        'x' AS ColA,
        'y' AS ColB,
        1 AS ColC,
        5 AS time),
      (
      SELECT
        'x' AS ColA,
        'y' AS ColB,
        0 AS ColC,
        6 AS time),
      (
      SELECT
        'k' AS ColA,
        'z' AS ColB,
        1 AS ColC,
        4 AS time)
    

    然后您进一步选择您感兴趣的内容,最终查询如下:

    SELECT
      ColA,
      ColB,
      ColC,
      time
    FROM (
    --the above query here--)
        where last_Col_C=1
    

    【讨论】:

    • 非常感谢!你说得对,这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2017-11-22
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多