使用ORDER BY的SQL查询第2部分

时间:2011-01-08 13:25:49

标签: sql

这是一个后续问题: SQL Query with ORDER BY

但我认为SQL逻辑会有很大差异,所以我将其作为单独的问题发布。

我正在尝试扩展我的sql SELECT查询它并遇到一些麻烦:

我有桌子:

id    type      radius
-------------------------
1     type1     0.25
2     type2     0.59
3     type1     0.26
4     type1     0.78
5     type3     0.12
6     type2     0.45
7     type3     0.22
8     type3     0.98

我正在尝试学习SELECT每个给定类型的第二小半径。因此返回的记录集应如下所示:

id    type      radius
-------------------------
3     type1     0.26
2     type2     0.59
7     type3     0.22

(注意:在引用的问题中,我一直在寻找最低半径,而不是第二最低半径)。

我假设我必须使用LIMITOFFSET,但是如果我使用MIN()则不会返回包含最小半径的不同记录?

有没有人对如何攻击它有任何想法?

非常感谢, 布雷特

3 个答案:

答案 0 :(得分:2)

您没有提及您的DBMS,因此我将发布一个与支持标准窗口函数的DBMS一起使用的解决方案:

SELECT *
FROM (
  SELECT id, 
         type,
         radius, 
         dense_rank() OVER (PARTITION BY type ORDER BY radius ASC) as radius_rank
  FROM radius_table
) t
WHERE radius_rank = 2

通过调整WHERE条件

,您可以轻松选择第3低或第14最低

如果您有多个符合第二低的行(LIMIT解决方案只显示其中一个),此解决方案也可以使用

答案 1 :(得分:1)

此查询为您提供给定类型的第二个位置

SELECT  *
FROM    `test`.`rads`
WHERE   type = 'type wanted'
ORDER BY `radius` ASC
LIMIT 1, 1

您可以在子查询中将其混合以获取整个列表,例如此查询

SELECT  id, type, radius
FROM    `test`.`rads` t
WHERE   id = (
    SELECT  id
    FROM    `test`.`rads` ti
    WHERE   ti.type = t.type
    ORDER BY `radius` ASC
    LIMIT 1, 1)
ORDER BY radius ASC, id DESC

使用此查询,您可以通过更改LIMIT第一个参数

来改变位置

答案 2 :(得分:0)

我会使用你之前的答案中的SQL查询,并在其中添加一个WHERE指令,删除包含匹配的“第一最低半径”的'id'的所有记录。

SELECT t1.id,t1.type,t1.radius FROM table t1 
WHERE radius = ( 
     SELECT MIN(radius) FROM table
     WHERE radius = t1.radius
     AND id not IN (
       SELECT t2.id FROM table t2
       WHERE radius = ( 
         SELECT MIN(radius) FROM table
         WHERE radius = t2.radius
       )
     )
   )