2009-08-28 4 views
1

Supposons que je cherche à sélectionner 3 colonnes à partir de quelques tables jointes: event_id, home_team et les résultats d'une fonction d'agrégation. L'event_id est une clé primaire auto-incrémentée. L'attribut home_team n'est pas unique à chaque enregistrement de la table. Je veux grouper par event_id pour générer la fonction d'agrégat, puis trier par les résultats de la fonction d'agrégat en prenant les 3 valeurs les plus élevées. Mais je veux aussi que l'home_team soit unique. Comment puis-je faire ceci? Je ne peux pas faire DISTINCT car l'enregistrement aura home_team, event_id et les résultats de la fonction d'agrégation. L'event_id sera toujours unique, donc ma requête DiSTINCT ne fait rien.GROUP BY et unicité dans plusieurs colonnes

Je dois regrouper par event_id car la fonction d'agrégat en dépend, donc je ne peux pas grouper par home_team. Si le groupe I par les deux, il ne sera pas utile, soit parce que ...

EXEMPLE

Table 1 
    id: 1 
    event_id: 1 
    value: 2 

    id 2 
    event_id: 1 
    value: 6 

    id 3 
    event_id: 2 
    value: 4 

    id4 
    event_id: 2 
    value: 3 

    id5 
    event_id: 3 
    value: 1 

Tableau 2

event_id (PK, autoincremented): 1 
home_team: 1 

event_id: 2 
home_team 2 

event_id: 3 
home_team: 1 

SELECT *, AVG(table1.value) as average FROM table1 JOIN table2 ON table1.event_id = table2.event_id GROUP BY table2.event_id ORDER BY average DESC 

Je dois groupe par table2.event_id afin de générer le bon résultat de la fonction agrégée. Cependant, je veux aussi HOME_TEAM soit distincte de sorte que la sortie désirée sera deux résultats avec un event_id 1 et event_id 2

+0

Je ne vous comprends pas. Dans le domaine d'un seul event_id, peut-il y avoir plusieurs home_teams? Si c'est le cas, comment choisissez-vous «sélectionner»? –

+0

Je pense que nous avons besoin d'un peu plus de détails. Pouvez-vous fournir des versions SQL ou simplifiées de votre SQL pour illustrer ce que vous essayez de décrire? –

+0

Merci les gars, j'ai vomi un exemple. Espérons que cela rendra les choses plus claires ... Merci pour l'aide –

Répondre

0

Utilisez ceci:

GROUP BY event_id, home_team 

Ce groupe ne fera que les enregistrements qui ont la même event_id que ainsi que le même home_team.

+0

Malheureusement, je ne peux pas faire cela parce que l'event_id est plus granulaire que le homepage donc le regroupement par home_team après event_id ne fait rien .... –

1

Eh bien, une fonction agrégée regroupée par une clé unique ne va pas faire grand chose pour vous, c'est certain. On dirait que vous êtes embourbé dans l'idée de grouper alors que tout ce que vous voulez vraiment, ce sont les trois plus importants événements pour chaque home_team.

Essayez quelque chose comme ça, à la place:

select 
    event_id, 
    home_team, 
    value 
from 
    my_tbl t 
where 
    event_id in 
     (select event_id from my_tbl 
     where home_team = t.home_team 
     order by value desc limit 0,3) 

Mise à jour: Votre modification efface certaines choses, donc voilà:

select 
    (select min(event_id) from table2 where home_team = t2.home_team) as event_id, 
    t2.home_team, 
    avg(t1.value) as average 
from 
    table1 t1 
    inner join table2 t2 on 
     t1.event_id = t2.event_id 
group by 
    t2.home_team 

Qu'est-ce que vous décrivez est assez absurde. Vous voulez grouper par event_id mais en afficher seulement un home_team? Sauf si vous cherchez à prendre le haut home_team rangée:

select 
    home_team, 
    max(average) as topavg 
from 
    (
    select 
     t2.event_id, 
     t2.home_team, 
     avg(t1.value) as average 
    from 
     table1 t1 
     inner join table2 t2 on 
      t1.event_id = t2.event_id 
    group by 
     t2.event_id, t2.home_team 
    ) as a 
group by 
    home_team