代码之家  ›  专栏  ›  技术社区  ›  AntonTkachov

按差异排序,带/不带行编号()

  •  0
  • AntonTkachov  · 技术社区  · 8 年前

    我使用: 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
    

    第二个查询与第一个查询非常相似,但我添加了 行编号() 选择:

    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 顺序,而在第二个查询中,它是按排序的 身份证件 在里面 DESC 顺序,但我的查询是相同的。我知道 同质光波导 解决这个问题,但我想理解 为什么? 这会发生吗?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Gordon Linoff    8 年前

    在中有多行具有相同的值 order by .

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

    SQL排序的不稳定性是关系表(和结果集)表示的事实的直接结果 无序 设置。没有额外订购。解决方案很简单。对于稳定排序,只需向 订购人 :

    order by ranking desc, id