dense_rank()order by和nulls - 如何让它将它们视为排名的底部?

时间:2013-06-18 19:36:32

标签: sql postgresql null sql-order-by window-functions

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

1 个答案:

答案 0 :(得分:7)

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

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

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

Postgres开箱即用。由于NULL按升序排序,因此当订单被反转时,它应默认为第一个。

相关: