这是一个后续问题: 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
(注意:在引用的问题中,我一直在寻找最低半径,而不是第二最低半径)。
我假设我必须使用LIMIT
和OFFSET
,但是如果我使用MIN()
则不会返回包含最小半径的不同记录?
有没有人对如何攻击它有任何想法?
非常感谢, 布雷特
答案 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
)
)
)