2016-05-08 6 views
0

Это не конкретный вопрос о dbms, а общая проблема sql.sql aggregate data

У меня есть этот набор данных

userid | objecteid| count 
-------------------------- 
1  | 1  | 12 
1  | 2  | 15 
1  | 3  | 6 
2  | 4  | 30 
2  | 1  | 1 
2  | 5  | 9 

с одного запроса мне нужно найти: для каждого пользователя, объект с максимальным числом

ищет результат:

userid | objecteid| count 
-------------------------- 
1  | 2  | 15 
2  | 4  | 30 

, поскольку объект 2 имеет максимальное количество для пользователя 1, а объект 4 имеет максимальное количество для пользователя 2

ответ

1

Это легко решить с помощью оконных функций.

Ниже стандарта ANSI SQL:

select userid, objecteid, "count" 
from (
    select userid, objecteid, "count", 
     max("count") over (partition by userid) as max_cnt 
    from the_table 
) t 
where "count" = max_cnt; 

Если есть два объекта с одинаковым count, как будет возвращен.

В качестве альтернативы это также может быть сделано с помощью row_number() вместо:

select userid, objecteid, "count" 
from (
    select userid, objecteid, "count", 
     row_number() over (partition by userid order by "count" desc) as rn 
    from the_table 
) t 
where rn = 1; 

В отличие от первого запроса, это будет только выбрать один строку, если пользователь имеет более одного объекта с таким же кол. Если вы хотите, чтобы эти дубликаты возвращаемые использовать dense_rank() вместо row_number()

SQLFiddle: http://sqlfiddle.com/#!15/f02a9/1

+0

отсутствует ObjectID во внешнем запросе –

+0

@ZoharPeled: спасибо, фиксированная –

0

попробовать этот

Select * from tableName 
     where count in (
      Select Max(count) 
      from tableName 
      group by userid 
     )