2011-12-25 59 views
2

我有這個表查找最大行及其在SQL Server值2000

ID Level Value 
1  1  10 
1  2  20 
1  3  15 
1  4  18 
2  2  12 
2  1  20 
3  1  50 
3  2  80 

我要找到每個ID的最高水平,該最大行的值,結果:

ID Level Value 
1  4  18 
2  2  12 
3  2  80 

我不想使用嵌套的「選擇」,因爲我的表是太大,嵌套查詢減緩我的查詢 感謝所有幫助

回答

0

您可以使用自連接和空測試來完成此操作。

SELECT T.* 
FROM T 
LEFT OUTER JOIN T AS T2 
ON T2.ID = T.ID AND T2.[Level] > T.[Level] 
WHERE T2.ID IS NULL 
6

未經測試的SQL Server 2000中,但假設LevelValue都是正整數,像下面這樣應該不需要嵌套的SELECT

SELECT ID, 
     MAX(Level) AS Level, 
     Max(Level * Cast(10000000000 AS NUMERIC(38)) + Value) 
               % 10000000000 AS Value 
FROM T 
GROUP BY ID 

或與負值

SELECT ID, 
     Max(Level) AS Level, 
     Cast(Substring(Max(CASE 
          WHEN Level < 0 THEN 0x00 
          ELSE 0x01 
          END + Cast(Level AS BINARY(4)) + 
           Cast(Value AS BINARY(4))), 6, 4) AS INT) AS Value 
FROM T 
GROUP BY ID 
+0

+1非常有趣的想法。難道你不能在第二列使用'max(Level)'嗎? – DavidEG 2011-12-25 13:15:29

+0

@DavidEG - 好點!會改變。 – 2011-12-25 13:16:48

+2

如果有人想知道這個「魔法」是如何工作的,那麼級別欄會放大很多並添加到值欄中。這會在應用最大值時將值與級別一起拖動。然後放大的水平值被刪除,離開該值。 – 2011-12-25 13:28:10

0

科佩斯要提供替代版本:

select T.* from 
(select ID, MAX(Level) as M_Level from T group by ID) Q, T 
where Q.ID = T.ID and Q.M_Level = T.Level 

我知道你不想要一個嵌套的選擇,但它可能是派上用場不同的情況。我用幾百萬行的SQL Profiler測試了它,性能差異是可以接受的。