2009-11-09 5 views
2

J'essaie de faire quelque chose et je ne sais pas comment le faire.Pour chaque ligne de la requête, sélectionnez le top 20 de l'autre requête

J'ai des données comme ceci:

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) 

qui me renvoie le nombre groupé à l'heure et le nom.

Je voudrais que ce soit juste

for each hour, top X counts 

Est-ce possible?


j'ai fini avec:

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 

Répondre

3

Essayez:

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 

(je ne vois pas le but de la clause WITH donc je l'ai retiré de la mienne).

+0

J'ai enlevé la « virgule » dans (partition par lenom, commande par cnt desc) et je devais déstiné par heure au lieu de theName mais sinon parfait ! – svrist

+0

Oups, corrigé maintenant. Merci. –

2

Vous pouvez le faire avec row_number(), mais cela nécessite une autre sous-requête ou une autre CTE. Voici la double CTE, puisque Tony Adrews déjà posté l'approche sous-requête:

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

Dans mon crapaud j'ai eu besoin de changer "Rownumber (....)" à "Rownumber() sur (..." mais fonctionne autrement comme un charme.Tony a remporté le canon le plus rapide dans l'ouest par – svrist

+0

@svrist: Check, Je vais modifier la réponse – Andomar

Questions connexes