【问题标题】:Select the row number X in SQLITE when order by desc按 desc 排序时选择 SQLITE 中的行号 X
【发布时间】:2017-09-17 12:01:29
【问题描述】:

我正在使用 SQLITE(所以没有 row_number)

这是我的数据库调用:tableau

ID | Nom  | Score
---|------|------
1  | Clem | 50
2  | Caro | 60
3  | Flo  | 55

我正在使用:

SELECT * FROM tableau ORDER BY Score DESC

这是我得到的:

ID | Nom  | Score
---|------|------
2  | Caro | 60
3  | Flo  | 55
1  | Clem | 50

但我想在第二行按降序排序后获得“Nom”值

我想使用:

SELECT Nom FROM tableau WHERE rowid = 2 ORDER BY Score DESC 

但结果是“Caro”(预期结果:“Flo”)

【问题讨论】:

    标签: sql sqlite sql-order-by


    【解决方案1】:

    不幸的是,SQLite 不支持窗口函数或变量,这两种方法您会在其他数据库中使用。处理这个问题的最好方法通常是在应用层

    您可以获取一行的 rank,然后使用它:

    select t.*
    from (select t.*,
                 (select 1 + count(*)
                  from tableau t2
                  where t2.score > t.score
                 ) as rnk
          from tableau t
         ) t
    where rnk = 2;
    

    请注意,这会使并列分数具有相同的排名。

    我应该注意,您也可以将其表述为:

    select t.*
    from tableau t
    where 2 = (select 1 + count(*)
               from tableau t2
               where t2.score > t.score
              );
    

    编辑:

    如果你想要一个稳定的排序,你必须将它包含在逻辑中:

    select t.*
    from tableau t
    where 2 = (select 1 + count(*)
               from tableau t2
               where t2.score > t.score or
                     (t2.score = t.score and t2.name < t.name)
              );
    

    【讨论】:

    • 我尝试了第二个,它有效!谢谢你! "t.*" 是什么意思?和“tableau t” ....t 是什么?
    • 如你所说,如果 2 个分数相等...有一个问题,我该如何添加,如果 2 个分数相等则按名称排序?
    • 非常感谢....我花了 3 个小时!!!!!!!谢谢!!!!!!我现在明白了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多