BigQuery:仅当字段具有特定值时才获取表中的最新行

Posted

技术标签:

【中文标题】BigQuery:仅当字段具有特定值时才获取表中的最新行【英文标题】:BigQuery: Get latest row in a table only if a field has a specific value 【发布时间】: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)结合子查询的各种查询,但未能达到预期的结果。

【问题讨论】:

【参考方案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

【讨论】:

非常感谢!你说得对,这正是我所需要的。

以上是关于BigQuery:仅当字段具有特定值时才获取表中的最新行的主要内容,如果未能解决你的问题,请参考以下文章

仅当表中不存在该值时才更新 SQL 列

MongoDB + Mongoose:仅当给定键不存在或具有虚假值时才设置

仅当它是数组中的值时才可以打印数字吗? (Java)[重复]

仅当元素具有特定子元素时才向元素添加规则

仅当连接明确时才更新行

具有数组字段的 bigquery 表中的不同行