我正在使用 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 的结果。)