2009-04-27 6 views
0

Ceci fait référence à la question que j'ai posée auparavant, et a obtenu une réponse très rapide (max count together in an sql query). Le Problemset est similaire, mais la solution dans la question précédente me forcerait à accéder à un db dans une boucle qui va causer des problèmes de performance. Alors ce que j'ai maintenant, après quelques jointures est:compte maximum ensemble dans une requête sql 2

id | description 
    0 | bla 
    0 | blub 
    0 | bla 
    1 | blablub 
    1 | bla 
    ... | ... 

Comme u peut voir, maintenant l'id n'est pas une clé primaire plus. Ce que je veux, c'est obtenir la description la plus utilisée pour chaque identifiant dans le jeu de résultats. Cela devrait ressembler à ceci:

id | most_popular_description | times_the_desc_appeared_for_an_id 
    0 |      bla |         2 
    1 |     blablub |         1 
... |      ... |        ... 

Répondre

1

Si vous voulez seulement les articles les plus populaires, alors je crois que cela devrait vous donner le jeu de résultats que vous recherchez. Il existe d'autres façons de le faire, mais stats_mode est le moyen le plus simple d'obtenir la valeur "la plus répandue" dans un groupe (c'est-à-dire le mode).

SELECT t.id, 
     t.description AS most_popular_description, 
     COUNT(*) AS times_the_desc_appeared_for_an_id 
FROM mytable t INNER JOIN (
    SELECT id, stats_mode(description) AS desc FROM mytable GROUP BY id 
) a ON t.id = a.id AND t.description = a.desc 
GROUP BY t.id, t.description; 

Notez que la requête imbriquée (vue en ligne) est nécessaire car vous souhaitez également le nombre.

+0

très cool, merci beaucoup – Red33mer

1

Cela devrait faire l'affaire.

select id, description, COUNT(description) 
from mytable 
group by id, description 
order by 3 desc 
+0

SRY, mais ce n'est pas tout à fait ce que je voulais, encore merci pour l'aide – Red33mer

0

Je pense que vous pouvez utiliser la fonction analytique Dimming_Rank() pour obtenir le N supérieur pour chaque groupe.

Quelque chose comme ceci:

select id, description, times_the_desc_appeared_for_an_id 
from 
(
    select id, description, count(description) times_the_desc_appeared_for_an_id 
    dense_rank() over (partition by id, description order by count(description) desc) position 
    from mytable 
    group by id, description 
) 
where 
    position <= 3 
order by id, times_the_desc_appeared_for_an_id; 
+0

havent testé, puisque la solution par les œuvres rwwilden, mais merci quand même – Red33mer

Questions connexes