【问题标题】:Get the second highest value with Standard SQL使用标准 SQL 获得第二高的值
【发布时间】:2013-06-27 03:20:19
【问题描述】:

考虑一个数据库,其中一个名为user 的表有两个字段:

“id”(类型:整数,主键) “名称”(类型:VARCHAR(32))

编写一个标准 SQL 查询,从 user 表中检索第二高的 id 值。返回的值应使用列名id 表示。

什么是标准 SQL?

select id from user order by id desc limit 1,1;

select user.id as id from user order by user.id desc limit 1,1;

如果他们都错了,然后正确答案?

【问题讨论】:

  • 正确的答案是要么使用 ORM,要么不改变你的数据库。
  • 您的问题的一个大问题是“标准 SQL”有点像神话......人们谈论它,但它并不真正存在。是的,有 SQL 标准,但没有什么能准确地实现其中的任何一个。请注意这个问题是如何结束的:stackoverflow.com/q/5871183/456188

标签: sql


【解决方案1】:

据我所知,TOPLIMIT 都不是 SQL 标准定义的(至少我找不到)。

所以唯一的纯标准解决方案是使用窗口函数:

select *
from (
   select id, 
          row_number() over (order by id desc) as rn
   from "user"
) as t 
where rn = 2;

【讨论】:

  • 可爱的代码,我使用这样的方法将数据发送回gridview,以免将所有行都拉回来
【解决方案2】:
SELECT MAX( id) FROM user where id !=( SELECT max (id) FROM user ) 

【讨论】:

  • 它不会返回所有内容。它只会返回第二高的。试试看
  • 过滤我在主查询中使用的 max(id)
【解决方案3】:
select 
    secondhighest.id
from 
    "user" highest
    left join "user" biggerthanhighest on 
        biggerthanhighest.id > highest.id
    left join "user" secondhighest on
        highest.id > secondhighest.id
    left join "user"  biggerthansecondhighest on
        biggerthansecondhighest.id > secondhighest.id and
        biggerthansecondhighest.id < highest.id
where
    biggerthanhighest.id is null and
    biggerthansecondhighest.id is null

将避免顶部和子查询。在非常大的桌子上可能相当快?

【讨论】:

  • 这不是标准 SQL(标准 SQL 使用双引号 " 作为标识符)
【解决方案4】:
SELECT TOP 1 id
FROM (
SELECT DISTINCT TOP 2 id
FROM user
ORDER BY id DESC) a
ORDER BY id

我认为这也是相当标准的。

【讨论】:

  • TOP 不是 SQL 标准的一部分。
【解决方案5】:
SELECT TOP 1 "id" FROM (SELECT TOP 2 "id" FROM "user" ORDER BY "id" DESC) AS "wt" ORDER BY "id"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多