回答
在内部查询中,您可以选择列的最大长度并在外部查询中将其消除,然后执行max
,以便获得该列中的第二大长度。
select max(val) as secondlargest
from t join
(
SELECT max(len(val)) as lf1
FROM t
) x
on len(t.val) < x.lf1
如果您需要所有长度第二大的值,最好使用cte
s。 SQL Fiddle
with top2 as (
select top 2 len(val) as lf1
from t
order by len(val) desc
) ,
scnd as
(select min(lf1) as snd from top2)
select val
from t join scnd
on len(t.val) = scnd.snd
vkp,max(val)不处理长度。它应该是max(len(val))不是吗? – ElenaDBA
@ ElenaDBA ..在第一个查询中,第二个最大长度只能得到一个“val”。但是,使用'cte'的第二个查询将为您提供第二个最大长度的所有值。 –
的SQL Server 2012+支持OFFSET/FETCH
:
select len(f1)
from table1
group by len(f1)
order by len(f1) desc
offset 1
fetch first 1 row only;
在早期版本也有不同的方法。这里是一个:
with ml as (
select len(f1) as lenf
from table1
group by len(f1)
)
select max(lenf)
from ml
where lenf < (select max(lenf) from ml);
如果你只需要第二个:
SELECT MAX(Field1) FROM Table1
WHERE Field1 NOT IN (SELECT MAX(Field1) FROM Table1)
请注意,这是唯一正确的,当两个极大值是不一样的。如果他们是,第二个答案仍然会被选中。例如:
1: 500 points
2: 500 points
3: 410 points
2将仍然被选中,但它是有争议的,你需要哪个答案。
窗口功能通常是最有效的方法来做到这一点,它们最终是灵活的,以适应不同的要求。下面是一个例子(Azure上的SQL数据库进行测试):
select f1, lenf, lenf_dense_rank
from (
SELECT
f1,
lenf=len(f1),
lenf_dense_rank=dense_rank() over (order by len(f1) desc)
FROM table1
) x
where lenf_dense_rank = 2
此外,根据您的需求,您可能需要使用rank()
与dense_rank()
,但窗口功能仍然使用了这样的情况的技术。强烈建议查找它们并更多地了解它们 - 应该比目前更频繁地使用它们。
顺便说一句,通过说“通常更高效”,我的意思是你正在做1次全表扫描(或索引扫描),而自连接,并且在同一个表上使用max和子查询,需要至少2相同类型的扫描 - 数据库管理系统完成的相关工作量不应忽视!使用OFFSET/FETCH组合确实有效,但窗口函数可以做得更多,现在得到了广泛的支持,所以我必须尽可能地推荐它们。 – SlimsGhost
- 1. 如何在选择第一个字段中的选择之前阻止第二个字段的选择?
- 2. 从左连接中的第二个表中选择字段
- 3. SQL,从一个表中选择,更改一个字段,更新第二个表中的字段
- 4. 我应该在表中创建一个新字段还是只选择第二个表的最大值
- 5. 选择第二个最大访问表
- 6. 大教堂的选择 - 选择第二个表格中的第012行
- 7. Flexform字段选择项目的长度
- 8. 根据第一个片段中的选择更改第二个片段
- 9. 从第二个表中选择值,该ID在我的第一个表中
- 10. css选择器:第一段的第一个字母在div内
- 11. 一个表内的字段的总和,GROUP BY第二个表中的字段
- 12. MySQL的一个表中选择字段不在另一个表
- 13. 从一个表中选择数据的字段大于另一个表中另一个字段的数据
- 14. 如何根据Access 2013中第一个字段的选择获取第二个字段自动填充?
- 15. MySQL - 从一个表中选择所有内容,但只在第二个表中选择第一个匹配值
- 16. 使用在第一个选择框中选择的值填充第二个选择列表Zend Framework 1
- 17. 如何选择第二段?
- 18. 从一个表中选择所有字段,并从mysql中的另一个表中选择一个字段
- 19. jQuery如何根据第三个选择列表选项更改第二个选择列表,并基于第一个选择第二个选择
- 20. 如何在第二次选择第一个文本字段时关闭键盘?
- 21. 非法矢量字段选择长度
- 22. 基于第一个选择列表过滤第二个选择列表
- 23. 如何使用选择的字段长度/ untrim使用选择
- 24. 长文本字段的最大长度
- 25. jQuery的某些选项选择第一个选择列表,启用第二个选择列表
- 26. 在字段中选择每个值的第一条记录
- 27. KDB选择在第二个表中具有匹配键的一个表的行
- 28. 自动设置第二个选择字段的值
- 29. jquery填充第二选择项目的选项大于第一选择
- 30. 选择框的问题 - 基于第一个选择的第二个选项
查看此[this](http://www.programmerinterview.com/index.php/database-sql/find-nth-highest-salary-sql/) – SomeJavaGuy