我有这张桌子
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 :(得分:6)
在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
答案 1 :(得分: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测试了几百万行,性能差异是可以容忍的。
答案 2 :(得分:0)
您可以使用自联接和null测试来执行此操作。
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