2009-01-29 50 views
2

這個問題是如此複雜的例子會工作最棒的,我對ODBC下表,不SQL Server管理如何顯示一列中最低數量的一行?

NAME  SEQNUM  

JOHN  2   
JOHN  4 
JOHN  7 
MARY  12 
MIKE  4 
MIKE  9 
PETER 7 
PETER 12 

所以,我想拉回來一個名字與最低SEQNUM ...

NAME  SEQNUM 
JOHN  2 
MARY  12 
MIKE  4 
PETER 7 

該數據不適用於SELECT (MIN(SEQNUM))。這返回一個數字。我希望將實際數據放入我的數據集中。 是否有人知道如何做到這一點?

+0

您只對一行或一行/名稱感興趣嗎? – 2009-01-29 16:12:56

+0

你想要什麼結果顯示?我仍然對你想要完成的事情感到困惑。 – 2009-01-29 19:20:32

回答

0
SELECT t1.* 
FROM yourtable t1 
LEFT OUTER JOIN yourtable t2 
ON (t1.name = t2.name AND t1.seqnum > t2.seqnum) 
WHERE t2.seqnum IS NULL; 

回覆。 Dems的評論:

如果您只是使用GROUP BY name那麼您的選擇列表只能包括name和聚合函數MIN()。通常情況下,您確實希望每個組出現最小值的整行。

如果使用TOP溶液(或LIMIT如果你使用MySQL和PostgreSQL,SQLite的),那麼你就不能獲得基於name最低爲多個組,你只能得到最低的一個name

我在OP的問題的各行之間閱讀,並猜測他們希望整行,有比問題中顯示的列更多的列(總是有),並且所需的查詢應返回多個名稱的結果,而不僅僅是一個。


Re。 SquareCog的評論:

你建議的解決方案也是一個連接:

SELECT t1.* 
FROM yourtable t1 
    JOIN (SELECT name, MIN(seqnum) AS seqnum FROM yourtable GROUP BY name) t2 
    USING (name, seqnum); 

然而,這種解決方案可能無法使用索引來評估加盟,而解決辦法我給即可。

2
SELECT TOP 1 Name, SeqNum FROM yourtable ORDER BY SeqNum DESC 

將顯示一個具有最高序號(SeqNum)

+0

通過切換排序順序可以獲得最低限度 – cdeszaq 2009-01-29 16:08:58

+0

您將只獲得1行,1個名稱,並非所有名稱根據需要 – 2009-01-29 16:21:24

+0

這將與SQL服務器管理。我正在使用odbc – MrM 2009-01-29 16:22:51

14
select Name, MIN(SEQNUM) 
from TABLE 
Group By Name 
3

我相信這是你想要什麼:

select NAME, min(SEQNUM) as SEQNUM 
from TABLE 
group by NAME 
0
從表T

選擇名稱,其中SEQ_NUM =(選擇列表TT最大(sequnum),其中t.name = tt.name)

但我更喜歡分組。

1

把伊恩和比爾的答案放在一起給你提供了兩全其美的方法 - 獲得完整的記錄,而不必做一個潛在的非常昂貴的連接(任何連接都不是一個equijoin可以把事情吹得像你一樣,相信)。

SELECT t1.* 
FROM yourtable t1, 
    (SELECT name, MIN(seqnum) as seqnum 
     FROM yourtable 
     GROUP BY name) t2 
WHERE t1.name=t2.name 
     AND t1.seqnum=t2.seqnum 

您也可以使用連接語法來達到相同的結果(而不是在哪裏),但在這種情況下,我認爲這是一個更清晰一點發生了什麼事情,如果你使用的位置。