2013-05-10 3 views
0

나는 (내 스킬 레벨에서) 특히 어려운 쿼리를 선택하고 있습니다. 데이터베이스에 데이터가4 개 (maleName/femaleName/size/id) 인 데이터가 있습니다. 열 데이터는 다소 자명합니다. 나는 각 칼럼에 따라 남성의 이름, 여성의 이름, 아이디 (단지 값 1 또는 2를 얻는다)를 가진다. 유일한 문제는 남성과 여성의 이름 (부부로 표시)이 1 회 이상 나타납니다.그룹에 따라 postgreSQL 최대 선택

Database example. 
# | MaleName | FemaleName | Size | ID 
    1 - John - Mary - 9 - 1 
    2 - Nick - Stacey - 6 - 1 
    3 - Mike - Rachel - 2 - 1 
    4 - John - Mary - 3 - 2 
    5 - Mike - Rachel - 20 - 2 
    6 - Nick - Stacey - 13 - 2 
    etc... 

내가 필요로하는 각 부부의 최대 (크기)와이 속한 ID를 반환하는 선택 쿼리입니다 ... 내가 지금까지 했어 '무엇

Result example. 
# | MaleName | FemaleName | Size | ID 
1 - John - Mary - 9 - 1 
2 - Nick - Stacey - 13 - 2 
3 - Mike - Rachel - 20 - 2 

이입니다 :

select a.Mname,a.Fname,a.size 
from mytable a , mytable b 
where a.id=b.id and 
a.size in (select max(a.size) from mytable a , mytable b where a.id=b.id) 
group by a.Mname, a.Fname, a.size; 

나는 가깝거나 완전히 잘못되었는지 알 수 없습니다. 이 결과는 1 결과를 반환합니다. 약간의 조정이나 총 재 작성이 필요할 수도 있습니다. 어떤 도움이라도 대단히 감사하겠습니다! 미리 감사드립니다.

친절하게 제공합니다.

select mname, fname, size, id 
from (select t.*, 
      row_number() over (partition by t.mname, t.fname order by t.size desc) as seqnum 
     from mytable t 
    ) t 
where seqnum = 1 

기능 row_number()는 그룹 내에서 행에 일련 번호를 할당 :이 많은 데이터베이스에서 작동하기 때문에

답변

2

는 일반적으로, 나는 row_number()를 사용하여 이러한 문제를 해결한다. 이 경우 동일한 이름 쌍을 가진 모든 행에 번호가 매겨집니다 (partition by 절). 번호 매기기는 가장 큰 크기의 행 (order by size desc)부터 시작합니다. 가장 큰 크기를 원하므로 1의 시퀀스 번호를 갖습니다.

Postgres는 동일한 작업을 수행 할 수있는 distinct on 구문도 지원하지만 상당히 데이터베이스 별입니다.

+0

대단히 감사합니다. 불행히도 나는 당신이 나에게 준 것을 시도해 보았고, 부분적으로 (커플 등을 그룹으로 묶어서) 작동하지만 작은 숫자의 커플을 걸러 내지 못한다. –

+0

@GeorgeElementSotiriou. . . 당신의 쿼리에'where seqnum = 1'이 있습니까? 파티션 분할 절이 두 이름 만 포함합니까? –

+0

그 답변은 모두에게 그렇습니다. 또한 나는 그것이 나 자신에 의해 그렇게되어야한다는 것을 알았 기 때문에 당신이 몇 분 전에 편집 한 "mytable t"부분을 이미 정정했다. 아직도 분할이 이루어지면서 나는 동일한 "커플"을 차례대로 크기를 내림으로써 결정하지만 가장 작은 크기의 결혼 커플을 배제하지 못합니다. 너의 인생을 힘들게해서 미안해 ...! : –

관련 문제