2015-04-20 3 views
0

У меня есть данные, что выглядит какSQL, как извлечь наиболее распространенные значения из функции кадрирования

id channel amount date 
a PHONE  50  '1sep2014' 
a PHONE  100  '1oct2014' 
a INTERNET 20  '4oct2014' 
b PHONE  25  '2oct2014' 
b INTERNET 30  '3oct2014' 
c INTERNET 35  '1oct2014' 
c INTERNET 20  '2oct2014' 
c INTERNET 100  '3oct2014' 

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

У меня уже есть row_number() OVER(PARTITION BY ID ORDER BY DATE DESC) в моем первом запросе, так как мне нужно получить последние значения/канал и т. Д. Из этой таблицы. Я хотел бы связать все это с одним и тем же запросом, если это возможно.

+0

Пограничный случай: Какой ответ вы ожидаете для ид = Ь? ТЕЛЕФОН, ИНТЕРНЕТ или оба? – Turophile

+0

NULL или оба или случайные в порядке – shecode

ответ

1

Вы можете сделать это с оконными функциями и group by: с

select id, channel 
from (select id, channel, count(*) as cnt, 
      row_number() over (partition by id order by count(*) desc) as seqnum 
     from table t 
     group by id, channel 
    ) ic 
where seqnum = 1; 
Смежные вопросы