ORDER BY与/不带ROW_NUMBER()的差异

时间:2017-12-04 12:55:40

标签: sql postgresql

我很高兴: PostgreSQL 9.6.3

今天我在选择结果上遇到了一个非常奇怪的差异,具体取决于我的查询中是否存在ROW_NUMBER()函数调用

带输出的第一个查询如下:

SELECT "users"."id", "users"."ranking" FROM "users" WHERE "users"."mentor" = 't'  ORDER BY "users"."ranking" DESC LIMIT 10;

结果是:

   id   |     ranking
--------+-----------------
     33 | 4.36852371411504
 320145 | 4.08071526845868
 301573 | 3.98071042776232
  25649 | 3.92019074023998
 159117 | 3.92019074023998
   3218 | 3.86067914389982
 635532 | 3.79788768116942
    559 | 3.73163558856403
 359211 | 3.73163558856403
 635548 | 3.66173214016947

第二个查询与第一个查询非常相似,但我添加了ROW_NUMBER()选项:

SELECT "users"."id", "users"."ranking", ROW_NUMBER() OVER (ORDER BY "users"."ranking" DESC) FROM "users" WHERE "users"."mentor" = 't' ORDER BY "users"."ranking" DESC LIMIT 10;

结果是:

   id   |     ranking      | row_number 
--------+------------------+------------
     33 | 4.36852371411504 |          1
 320145 | 4.08071526845868 |          2
 301573 | 3.98071042776232 |          3
 159117 | 3.92019074023998 |          4
  25649 | 3.92019074023998 |          5
   3218 | 3.86067914389982 |          6
 635532 | 3.79788768116942 |          7
    559 | 3.73163558856403 |          8
 359211 | 3.73163558856403 |          9
 419302 | 3.66173214016947 |         10

如您所见,在第一种情况下,结果看起来像idASC顺序排序,而在第二次查询中,它按idDESC顺序排序,但我的疑问是一样的。我知道 HOW 来解决这个问题,但我想了解为什么会发生什么?

1 个答案:

答案 0 :(得分:3)

order by中有多个具有相同值的行。

在关系数据库中,排序是不稳定。当键值中存在关联时,行处于不确定的顺序。这就是你所看到的。

SQL排序的不稳定性是关系表(和结果集)代表无序集合这一事实的直接结果。没有额外的订购。解决方案很简单。要获得稳定的排序,只需在order by

中添加一个额外的唯一键即可
order by ranking desc, id