2014-09-12 6 views
1

두 개의 int 필드 (id, month)가있는 테이블 t1이 있는데 일부 값이 채워져 있습니다. 출력으로보고 싶은 것은 최대 (한 달의 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 절을 사용하여이를 달성하는 방법은 무엇입니까? 그리고 어느 것이 더 효율적입니까? 실제로 나의 테이블은 수천 개의 레코드로 구성됩니다. 그래서 하위 쿼리를 수행하면 좋은 생각이 아닐 것입니다! 어떤 도움을 주셔서 감사합니다.

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 

을하지만, 성능의 관점에서, 나는 원래 질문이 하나 사이에 큰 차이를 볼 수 없습니다 - 여기 the fiddle

+0

몇 가지 샘플 데이터가있는 테이블 구조를 보여주세요 – Raj

+0

@Raj 당신은 바이올린에서 찾을 수 있습니다. –

+0

그룹 집계 함수를 다룰 때 초과 절을 사용할 수 없습니다. –

답변

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

가있어이 작업을 시도 할 수 있습니다.

0

동일한 해결책이지만 CTE를 사용합니다. 실제로이 문제에 대해 창 작업 기능을 강제로 사용할 필요는 없습니다. 두 솔루션을 계획 탐색기와 비교하십시오.

; ID 의해 군 C1로부터 최대 주파수 등 (ID별로 T1 그룹 주파수 로서 선택 이드, 월, 수 (*), 월 ) 같은 C1 선택 ID 맥스 (주파수)와 maxfreq desc에 의한 순서;