【问题标题】:dense_rank() order by and nulls - how to make it treat them as bottom of the ranking?dense_rank() 排序和空值 - 如何使其将它们视为排名的底部?
【发布时间】: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


    【解决方案1】:

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

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

    不仅适用于窗口函数,还适用于ORDER BY任何地方

    Postgres 开箱即用地做正确的事情。由于NULL按升序排在最后,所以倒序时默认排在第一位。

    相关:

    【讨论】:

    • 太好了 - 非常感谢! (顺便说一句,我认为 postgresql 可能是正确的:-))
    猜你喜欢
    • 2017-02-20
    • 2014-11-28
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2010-11-18
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多