在sql server 2000中查找最大行及其值

时间:2011-12-25 12:55:41

标签: sql-server sql-server-2000 greatest-n-per-group

我有这张桌子

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  

我不想使用嵌套的“选择”因为我的表太大而嵌套选择会减慢我的查询速度 谢谢你的帮助

3 个答案:

答案 0 :(得分: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 

答案 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