回答
在內部查詢中,您可以選擇列的最大長度並在外部查詢中將其消除,然後執行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