首页 > 解决方案 > BigQuery FIRST_VALUE() - 先返回空值,同时仍指示排序?

问题描述

以如下数据结构为例:

ID 日期
1 2016-10-18
1 2019-08-01
1 2019-09-01
1 无效的
1 无效的

我希望能够对数据进行分区,添加一个具有最高日期但首先包含空值的新列。IE

ID 日期 第一个值
1 2016-10-18 无效的
1 2019-08-01 无效的
1 2019-09-01 无效的
1 无效的 无效的
1 无效的 无效的

在 Postgresql 中,这很简单:

SELECT *, first_value(date) OVER (PARTITION BY id order by date desc nulls first)

但是,在 BigQuery 中尝试此操作会引发以下错误:

NULLS FIRST not supported with descending sort order in RANGE clauses of analytic functions.

我可以实施什么来在 BQ 中实现相同的结果?

标签: sqlgoogle-bigquery

解决方案


不要使用first_value()(尽管你可以让它工作)。只需使用max()

SELECT *, max(date) OVER (PARTITION BY id order by date)

在您的逻辑中,如果您不想要NULLs,那么:

  • 使用NULLS LAST这样的NULL值不是第一个。
  • 使用IGNORE NULLS因此优先考虑非 NULL 值。

编辑:

哦,你想做完全相反的事情:

first_value(date) over (partition by id
                        order by (date is null) desc, date desc
                       )

推荐阅读