我使用以下查询返回Field1的最长值的长度:
SELECT MAX(LEN(Field1))
FROM Table1
如何修改我的查询以返回Field1的第二大长度?
答案 0 :(得分:3)
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);
答案 1 :(得分:1)
窗口函数通常是最有效的方法,它们最终可以灵活地满足不同的要求。以下是一个示例(在Azure SQL DB上测试):
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()
,但窗口函数仍然是用于此类情况的技术。强烈建议查找它们并更多地了解它们 - 它们的使用方式应该比现在更频繁。
答案 2 :(得分:0)
在内部查询中,您可以选择列的最大长度并在外部查询中将其消除,然后执行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
答案 3 :(得分:0)
如果你只需要第二个:
SELECT MAX(Field1) FROM Table1
WHERE Field1 NOT IN (SELECT MAX(Field1) FROM Table1)
请注意,只有当两个最大值不相同时,这才是正确的。如果是,则仍将选择第二个答案。例如:
1: 500 points
2: 500 points
3: 410 points
2仍然会被选中,但是你需要的答案值得商榷。