2016-02-27 3 views
0

Вопрос: В течение каждого дня укажите ИД пользователя, который прочитал наибольшее количество сообщений.Oracle Вложенная группировка

user_id msgID read_date 
1   1  10 
1   2  10 
2   2  10 
2   2  23 
3   2  23 

Я считаю, что дата является внешней группой и user_id является внутренней группой, но как сделать вложенность групп в SQL Server? Или как-то избежать этого?

ответ

1

Это задача для окна функции:

select * 
from 
(
    select user_id, read_date, count(*) as cnt, 
     rank() 
     over (partition by read_date   -- each day 
      order by count(*) desc) as rnk -- maximum number 
    from tab 
    group by user_id, read_date 
) dt 
where rnk = 1 

Это может возвращать несколько пользователей для одного с тем же максимальным числом, если вы хотите только один (случайным образом) переход на ROW_NUMBER

+0

Отличный ответ @dnoeth, но у вас есть spello на 'partition' :) –

+0

@GordonLinoff: Спасибо за определение ... – dnoeth

+0

@dnoeth Это именно то, что я хотел. Большое спасибо! – tic30

0
select user_id 
from 
(
    select user_id,count(msgID) 
    from table 
    group by read_date 
) 
where rownum <= 1;