2014-09-12 5 views
1

У меня есть таблица t1 с двумя int-полями (id, month), и я заполнил ее некоторыми значениями. То, что я хотел бы видеть как выход, - максимум (количество id в месяц). Я попытался следующий код и он работает отлично:раздел по количеству полей

select id,max(freq) as maxfreq from 
(select id,month,count(*) as freq 
from t1 
group by id,month) a 
group by id 
order by maxfreq desc 

Результат:

ID MAXFREQ 
1 3 
2 3 
3 1 
4 1 

Это нормально. Как добиться этого, используя предложение over partition by? И какой из них более эффективен? На самом деле моя таблица состоит из нескольких тысяч записей. Так что сделать подзапрос не будет хорошей идеей, я думаю! Спасибо за любую помощь. Вот the fiddle

+0

Покажите нам свою структуру таблицы с некоторыми данными образца – Raj

+0

@Raj вы можете найти ее в скрипке. –

+0

вы не можете использовать over-clause при работе с групповой функцией агрегации –

ответ

0
;WITH tmp AS (select id, row_number() over (partition by id, month order by id) rn 
     FROM t1) 
SELECT t.id, max(tmp.rn) as maxfreq 
from t1 t 
INNER JOIN tmp ON tmp.id = t.id 
GROUP BY t.id 
0

Вы можете попробовать это -

select id,max(freq) as maxfreq from 
(select id,row_number() over (partition by id,month ORDER BY id) as freq 
from t1 
) a 
group by id 
order by id,maxfreq desc 

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

0

То же решение, но с использованием CTE. На самом деле нет смысла принудительно использовать функции окон для этой проблемы. Сравните оба решения с плановым исследователем.

; с c1 как (выберите ид, месяц, COUNT (*), как частота от t1 группы по идентификатору, месяц ) выберите ид, макс (FREQ) в качестве MaxFreq от с1 группы по ID порядок от maxfreq desc;

Смежные вопросы