2010-10-19 35 views
5

如何在不使用限制的情況下從表格中選擇第二大標記? 我知道這是可能的使用LIMIT,但它可能沒有使用它?從無限制的表格中選擇第二大

假設我們有列和標記。

+2

什麼是你不喜歡LIMIT? – Unreason 2010-10-19 10:06:41

+0

這是一個面試問題;) – viMaL 2010-10-19 10:20:44

+0

我認爲這個問題本來可以解決它,而無需使用ORDER BY和LIMIT。因爲要求按O(n * log(n))排序,而面試官正在尋找O(n) – dharm0us 2010-11-30 07:43:29

回答

7

假設標記是唯一的,下面的查詢給你第二大標記。

SELECT MAX(marks) 
FROM  ATable 
WHERE marks < (SELECT MAX(marks) FROM ATable) 

要獲得整個記錄,你可以在INNER JOIN

SELECT t1.* 
FROM ATable t1 
     INNER JOIN (
      SELECT marks = MAX(marks) 
      FROM  ATable 
      WHERE marks < (SELECT MAX(marks) FROM ATable) 
     ) t2 ON t2. marks = t1.marks 
+0

對於MySql:select * from atable where marks =(選擇max(marks)作爲secmax from atable where marks < (從可打印中選擇最大(標記))) – dharm0us 2010-11-30 07:42:04

+0

是'(最大(標記)來自ATable的')'兌現或者這個查詢是否對每一行都運行?因爲這種方法在包含大約1000行的表上非常緩慢,謝謝 – 2011-05-09 11:25:39

+1

@Gabriel - 請注意查詢只返回一行。在適當的索引表上,這會導致一次索引掃描和一次索引查找。這對任何值得使用的數據庫引擎都不應該是個問題。 – 2011-05-09 11:48:56

1
select max(number), id 
from <tableName> 
where number < (select max(number) from <tableName>) 
0

你可以做一個

SELECT MAX(marks) FROM TABLE 
WHERE marks NOT IN (SELECT MAX(marks) FROM TABLE) 

但LIMIT應該有更好的表現那麼上面這個包起來,所以問題是你爲什麼不喜歡它?

0

如果你需要整行(所有列),這一個將做到這一點。另外,即使有幾個具有相同的第二最大值,它總是隻返回一行。

Select top 1 * 
    From (Select Top 2 * 
      From TABLE 
     Order By marks desc 
     ) a 
Order By marks asc 

如果希望只有一行與真正的第二最大值,你應該使用:

select Top 1 * 
    from TABLE 
where marks < (select max(marks) from TABLE) 
Order by max desc 

它可以通過CTE(SQL服務器2005+)也這樣做:

;With a as 
(
Select Dense_Rank() over (order by marks desc) as nRank, 
     * 
    From TABLE 
) 
Select Top 1 * 
    from a 
Where nRank=2 

如果您想查看所有具有第二個最大標記的行,只需從先前的查詢中刪除TOP 1。

相關問題