2011-02-02 4 views
1

Я застрял в очень простом запросе t-sql. Пожалуйста помоги !SQL Max on Group

Ниже мой результирующий набор:

Percentage---FirstName---SessionId 

34-----------ABC---------222 
67-----------ABC---------333 
11-----------ABC---------444 
83-----------XYZ---------555 
23-----------XYZ---------666 
64-----------XYZ---------777 

Из выше, я хочу записи каждого пользователя с максимальным процентом, например,

Percentage---FirstName---SessionId 
67-----------ABC---------333 
83-----------XYZ---------555 

Я не могу этого сделать, и я спешу. Пожалуйста, помогите в кратчайшие сроки. Любая помощь будет принята с благодарностью.

Спасибо.

+1

Какая сессия необходима в результате? Любые? И какой sql вы используете? MS, My? –

+0

Чтобы добавить к предыдущему, у меня уже есть SUM и GroupBy с исходным запросом. Я хочу, чтобы ввести sub-запрос или так, чтобы исходный набор результатов оставался неизменным при одинаковом числе столбцов. Благодарю. – user383698

+0

@ Bugai13: «Я застрял в очень простом запросе t-sql. Пожалуйста, помогите!» --- так очевидно, что это sql-сервер – zerkms

ответ

7
SELECT MAX(Percentage) AS Percentage, 
     FirstName 
    FROM mytbl 
GROUP BY FirstName 

Или, если вам нужно идентификатор сеанса:

SELECT mytbl.* 
     FROM mytbl 
INNER JOIN (SELECT MAX(Percentage) AS Percentage, 
        FirstName 
       FROM mytbl 
      GROUP BY FirstName) x ON x.Percentage = mytbl.Percentage 
           AND x.FirstName = mytbl.FirstName 
+0

Я не думаю, что вам нужен 'MAX (SessionId)'. ОП запросил «... записи каждого пользователя с максимальным процентом» – Tony

+0

@ Тони: вы пропустили ответ? ;-) – zerkms

+0

@zerkms: Либо я схожу с ума, прокомментировал неправильный ответ, либо вы его отредактировали :) – Tony

5

Если вам придется иметь дело со связями, то вы можете захотеть использовать оконные функции (если вы на SQL Server 2005 или более поздней версии) :

SELECT 
    * 
FROM 
    (SELECT mytbl.*,RANK() OVER (PARTITION BY FirstName ORDER BY Percentage desc) as rn) t 
WHERE 
    t.rn = 1 

Так что если есть две строки с одинаковым процентом, они оба будут возвращены. Если вам нужен только один результат, то вы можете добавить дополнительные столбцы «тай-брейкер» в пункт ORDER BY или переключиться с RANK() на ROW_NUMBER().

+0

+1 намного проще, чем то, что я исказил вместе. Ранжирующие функции по-прежнему не второстепенны для меня. –

+0

Кажется, лучше, только OP должен учитывать тот факт, что это для SQL Server 2005+. –

+0

@ Andriy M - спасибо, не мог вспомнить, с какой версией они были представлены. –