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
我不想使用嵌套的「選擇」,因爲我的表是太大,嵌套查詢減緩我的查詢 感謝所有幫助
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
我不想使用嵌套的「選擇」,因爲我的表是太大,嵌套查詢減緩我的查詢 感謝所有幫助
您可以使用自連接和空測試來完成此操作。
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
未經測試的SQL Server 2000中,但假設Level
和Value
都是正整數,像下面這樣應該不需要嵌套的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
科佩斯要提供替代版本:
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測試了它,性能差異是可以接受的。
+1非常有趣的想法。難道你不能在第二列使用'max(Level)'嗎? – DavidEG 2011-12-25 13:15:29
@DavidEG - 好點!會改變。 – 2011-12-25 13:16:48
如果有人想知道這個「魔法」是如何工作的,那麼級別欄會放大很多並添加到值欄中。這會在應用最大值時將值與級別一起拖動。然後放大的水平值被刪除,離開該值。 – 2011-12-25 13:28:10