Найти максимальный ряд и его значение в SQL Server 2000 - PullRequest
2 голосов
/ 25 декабря 2011

У меня есть эта таблица

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    Level    Value
 1     4        18
 2     2        12
 3     2        80  

Я не хочу использоватьвложенный «Select», потому что моя таблица слишком большая, а вложенный «select» замедляет мой запрос Спасибо за любую помощь

Ответы [ 3 ]

6 голосов
/ 25 декабря 2011

Не проверено в 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 
0 голосов
/ 13 января 2012

Вы можете сделать это с помощью самостоятельного объединения и проверки на нулевое значение.

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
0 голосов
/ 26 декабря 2011

Чтобы предоставить альтернативу:

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 с несколькими миллионами строк, разница в производительности терпима.

...