6

我正在使用 Postgresql 9.1.9 版:

select version();
"PostgreSQL 9.1.9 on armv7l-unknown-linux-gnueabihf,
 compiled by gcc (Debian 4.6.3-14+rpi1) 4.6.3, 32-bit"

我有一个简单的表(称为测试),它有一个可以为空的bigint列(称为 A)。该表有以下数据:

NULL
1
2

现在我想创建一个密集排名(因此使用了dense_rank()函数),所以我执行以下查询:

select "A", dense_rank() over (order by "A" desc) from public."Test"

这将返回:

NULL,1
2,2
1,3

有趣的是,如果我在 SQL Server 2008 R2 中设置完全相同的东西并运行它返回的相同查询:

2,1
1,2
NULL,3

所以,我对谁是正确的感兴趣,但更实际的是,我想要的是 SQL Server 的行为,那么,我怎样才能让 PostgreSQL 将 null 视为排名的底部

(即将 NULLS 排序为小于任何值)

我在dense_rank页面上注意到了这一点,但它并没有专门谈论这个功能,但也许它是一个线索?

注意:SQL 标准为lead、lag、first_value、last_value 和nth_value 定义了RESPECT NULLS 或IGNORE NULLS 选项。这在 PostgreSQL 中没有实现:行为总是与标准的默认值相同,即 RESPECT NULLS。同样,nth_value 的标准的 FROM FIRST 或 FROM LAST 选项也未实现:仅支持默认的 FROM FIRST 行为。(您可以通过反转 ORDER BY 排序来获得 FROM LAST 的结果。)

4

1 回答 1

10

使用该NULLS LAST子句修改 NULL值的排序方式。完全符合您的要求:

SELECT "A", dense_rank() OVER (ORDER BY "A" DESC NULLS LAST)
FROM   public."Test"

不仅适用于窗口功能,适用于ORDER BY 任何地方

Postgres 开箱即用地做正确的事情。由于NULL按升序排序最后,因此当顺序颠倒时,默认情况下它应该排在第一位。

有关的:

于 2013-06-18T19:43:10.043 回答