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

Tha*_*ris 2 google-bigquery

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

ColA | ColB | ColC | ColD
  x  |   y  |  1   |   5
  x  |   y  |  0   |   6
  k  |   z  |  1   |   4
Run Code Online (Sandbox Code Playgroud)

ColA、ColB 是字符串,ColC 是整数,ColD 是时间戳。

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

ColA | ColB | ColC | ColD
  k  |   z  |  1   |   4
Run Code Online (Sandbox Code Playgroud)

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

我尝试过使用聚合函数(例如 MAX、LAST)结合子查询进行各种查询,但无法达到所需的结果。

Pen*_*m10 5

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)
Run Code Online (Sandbox Code Playgroud)

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

SELECT
  ColA,
  ColB,
  ColC,
  time
FROM (
--the above query here--)
    where last_Col_C=1
Run Code Online (Sandbox Code Playgroud)