选择表中字段的第二大长度

时间:2015-08-31 13:27:32

标签: sql sql-server

我使用以下查询返回Field1的最长值的长度:

SELECT MAX(LEN(Field1))
FROM Table1

如何修改我的查询以返回Field1的第二大长度?

4 个答案:

答案 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仍然会被选中,但是你需要的答案值得商榷。