我正在使用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"
我有一个简单的表(称为Test),它有一个可为空的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标准定义了RESPECT NULLS或IGNORE NULLS选项 对于lead,lag,first_value,last_value和nth_value。这不是 在PostgreSQL中实现:行为总是与 标准的默认值,即RESPECT NULLS。同样,标准 仅从第一个或从最后一个选项获取nth_value的选项:仅 支持默认的FROM FIRST行为。 (你可以实现 通过颠倒ORDER BY排序来获得FROM LAST的结果。)
答案 0 :(得分:7)
使用NULLS LAST
子句修改NULL
值的排序方式。完全符合您的要求:
SELECT "A", dense_rank() OVER (ORDER BY "A" DESC NULLS LAST)
FROM public."Test"
不仅适用于ORDER BY
任何地方的窗口功能。
Postgres开箱即用。由于NULL
按升序排序,因此当订单被反转时,它应默认为第一个。
相关: