我很高兴: 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
如您所见,在第一种情况下,结果看起来像id
按ASC
顺序排序,而在第二次查询中,它按id
按DESC
顺序排序,但我的疑问是一样的。我知道 HOW 来解决这个问题,但我想了解为什么会发生什么?
答案 0 :(得分:3)
order by
中有多个具有相同值的行。
在关系数据库中,排序是不稳定。当键值中存在关联时,行处于不确定的顺序。这就是你所看到的。
SQL排序的不稳定性是关系表(和结果集)代表无序集合这一事实的直接结果。没有额外的订购。解决方案很简单。要获得稳定的排序,只需在order by
:
order by ranking desc, id