0

我有这个用旧版 SQL 编写的查询:

select
    nth(1, a) first_a, 
    nth(1, b) first_b
from (
    select *
    from
        (select 12 a, null b),
        (select null a, 54 b)
)

结果,我期待一行具有值 (12, null),但我得到了 (12, 54)。在NTH 的文档中,它说:

NTH(n, 场)

返回函数范围内的第 n 个连续值,其中 n 是一个常数。NTH 函数从 1 开始计数,因此没有第零项。如果函数范围的值小于 n,则函数返回 NULL。

没有任何迹象表明空值会被忽略。这是 BigQuery 中的错误吗?

4

1 回答 1

1

这是文档中的重要部分:

在功能范围内

范围通常是“记录”(在旧版 SQL 术语中),您可以在其中获取重复字段中的第 n 个值。但是,正如所写,此查询具有NTH用作聚合函数的效果。组中的值没有明确定义的顺序,但碰巧NULL在非空值之后排序,因此NTH(1, ...)给出非空值。尝试使用2作为序数,例如:

select
    nth(2, a) first_a, 
    nth(2, b) first_b
from (
    select *
    from
        (select 12 a, null b),
        (select null a, 54 b)
)

这将返回null,null作为输出。

话虽如此,为了确保查询中定义明确的语义,最好的选择是使用标准 SQLNTH使用标准 SQL 时,运算符的一些类似物是:

  • 数组括号运算符,例如array_column[OFFSET(0)]获取数组中的第一个元素。
  • NTH_VALUE窗口函数,例如NTH_VALUE(x, 1) OVER (PARTITION BY y ORDER BY z)。另见FIRST_VALUELAST_VALUE
于 2018-04-10T07:18:31.863 回答