【发布时间】:2013-06-15 04:06:18
【问题描述】:
我使用的是 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 视为排名的底部?? p>
(即将 NULLS 排序为小于任何值)
我在dense_rank页面上注意到了这个,但不是专门讲这个功能,但也许是一个线索?
注意:SQL 标准定义了 RESPECT NULLS 或 IGNORE NULLS 选项 用于领先、滞后、first_value、last_value 和 nth_value。这不是 在 PostgreSQL 中实现:行为始终与 标准的默认值,即 RESPECT NULLS。同样,该标准的 未实现 nth_value 的 FROM FIRST 或 FROM LAST 选项:仅 支持默认的 FROM FIRST 行为。 (您可以实现 通过反转 ORDER BY 排序得到 FROM LAST 的结果。)
【问题讨论】:
标签: sql postgresql null sql-order-by window-functions