2009-11-09 3 views
2

나는 뭔가를하려고하는데, 어떻게해야할지 잘 모르겠습니다.쿼리의 각 행에 대해 다른 쿼리의 상위 20 개를 선택하십시오.

나는 같은 일부 데이터를 가지고 :

나에게 시간과 이름으로 그룹화 수를 반환
WITH a AS (SELECT theid, thename, thetimestamp FROM mytable) 
SELECT thename, TRUNC (thetimestamp, 'HH24'), COUNT (theid) FROM a 
group by thename,trunc(thetimestamp,'HH24') ORDER BY COUNT (theid) desc) 

.

나는 그냥 싶습니다

for each hour, top X counts 

는 것이 가능할까요?


나는 종료와 :

SELECT thename, hour, cnt 
FROM 
(SELECT thename, hour, cnt, 
     rank() over (partition by hours order by cnt desc) rnk 
    FROM 
    (SELECT thename, TRUNC (thetimestamp, 'HH24') hour, COUNT (theid) cnt 
    FROM mytable 
    group by thename,trunc(thetimestamp,'HH24') 
) 
) 
WHERE rnk <= :X 

답변

3

시도 :

SELECT thename, hour, cnt 
FROM 
(SELECT thename, hour, cnt, 
     rank() over (partition by thename order by cnt desc) rnk 
    FROM 
    (SELECT thename, TRUNC (thetimestamp, 'HH24') hour, COUNT (theid) cnt 
    FROM mytable 
    group by thename,trunc(thetimestamp,'HH24') 
) 
) 
WHERE rnk <= :X 

(그래서 난 내에서 그것을 제거 내가 WITH 절의 목적을 보지 못했다).

+0

내가 (CNT 내림차순으로 thename하여 파티션 순서)에서 "쉼표"를 제거하고 내가 대신 thename하지만, 그렇지 않은 완벽한의 시간으로 partion을하는 데 필요한 다음은 이중 CTE는 토니 Adrews 이미 하위 쿼리 접근 방식을 기록하기 때문에,이다 ! – svrist

+0

죄송합니다. 이제 수정했습니다. 감사. –

2

row_number()를 사용하여 수행 할 수 있지만 다른 하위 쿼리 또는 다른 CTE가 필요합니다.

WITH a AS (
    SELECT thename, TRUNC(thetimestamp, 'HH24') as hour, COUNT(*) cnt 
    FROM mytable 
    GROUP BY thename, TRUNC(thetimestamp, 'HH24') 
), b AS (
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY hour ORDER BY ctn DESC) rn, 
     thename, hour, cnt 
    FROM a 
) 
SELECT * 
FROM b 
WHERE rn < 20 
+0

내 두꺼비에서 나는 "Rownumber (....)"를 "Rownumber() 이상"(그러나 ...)으로 바꿔야 만했지만, Tony는 서쪽에서 가장 빠른 총을 얻었다. – svrist

+0

@svrist : Check, 답변을 수정하겠습니다. – Andomar

관련 문제