2009-08-28 2 views
1

몇 가지 조인 된 테이블에서 event_id, home_team 및 집계 함수의 결과를 선택하려고합니다. event_id는 자동 증가 기본 키입니다. home_team은 테이블의 모든 레코드에 고유하지 않습니다. event_id로 그룹화하여 집계 함수를 생성 한 다음 가장 큰 3 개의 값을 취하는 집계 함수의 결과로 정렬하려고합니다. 그러나 home_team이 고유해야합니다. 어떻게해야합니까? 레코드에 home_team, event_id 및 집계 함수의 결과가 있으므로 DISTINCT를 수행 할 수 없습니다. event_id는 항상 고유하므로 내 DiSTINCT 쿼리는 아무 것도하지 않습니다.GROUP BY 및 여러 열의 고유성

집계 함수가 이에 따라 달라 지므로 event_id로 그룹화해야하므로 home_team으로 그룹화 할 수 없습니다. 모두 I 그룹은 도움이되지 않을 경우 중 하나

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 

... 때문에 표 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 

내가 올바른을 생성하기 위해 table2.event_id에 의해 그룹에 필요 집계 함수 결과. 같은 EVENT_ID 등이

GROUP BY event_id, home_team 

이 뜻을 그룹 레코드 만 : 그러나, 또한 그렇게 원하는 출력이 두 EVENT_ID 1 결과 EVENT_ID 2

+0

잘 모르겠습니다. 단일 event_id의 도메인에 여러 개의 home_teams가있을 수 있습니까? 그렇다면 "선택"할 대상을 어떻게 선택합니까? –

+0

좀 더 자세한 내용이 필요하다고 생각합니다. 설명하고자하는 것을 설명하기 위해 SQL 또는 SQL의 단순화 된 버전을 제공 할 수 있습니까? –

+0

고마워, 내가 예를 던졌다. 다행히 그 일을 명확하게 만들 것입니다 ... 도와 주셔서 감사합니다 –

답변

0

사용이 될 것입니다 HOME_TEAM 구별되고 싶어 잘 같은 home_team.

+0

불행히도, event_id가 hometeam보다 세분화되어 있으므로 event_id가 home_team으로 그룹화되지 않으므로 그렇게 할 수 없습니다 .... –

1

글쎄, 고유 키에 의해 그룹화 된 집합 함수는 당신에게별로 도움이되지 않을 것입니다. 그룹화에 대한 아이디어에 싫증이 난 것처럼 들리 겠지만 실제로는 모두 home_team에 대한 상위 3 개 최고 가치 이벤트입니다. 대신이 같은

시도 뭔가 :

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) 

업데이트 : 귀하의 편집, 그래서 여기에 몇 가지를 지 웁니다 간다 : 당신은 무엇을 설명하는 것은 매우 무의미하다

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 

. event_id로 그룹화하고 싶지만 그 중 하나만 표시하려면 home_team? 상단을 차지하려고하지 않는 한 home_team 행 :

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