2012-02-15 5 views
2

나는 데이터 테이블 번호가있는 경우 :SQL GROUP BY와 집계

+------+------+------+------+ 
| colA | colB | colC | colD | 
+------+------+------+------+ 
| 1 | 2 | 3 | 4 | 
| 1 | 2 | 9 | 5 | 
+------+------+------+------+ 

및 수행

select colA, colB, colC, MAX(colD) FROM Numbers GROUP BY colA, colB; 

가 나는 그것이 colA, colB에 의해 행 2. 그룹을 반환해야한다고 생각하고 선택합니다 colD에서 가장 큰

반환하려면 colC로 그룹화해야하기 때문에이 기능이 작동하지 않습니다.

왜? 내가하려는 일을하는 또 다른 방법이 있습니까?

colAcolB에서 행이 동일하지만 colD에서 가장 큰 행을 원합니다.

답변

5

이 문제를 처리하는 데는 몇 가지 방법이 있습니다. 가장 쉬운 방법은 colA, colB 그룹을 수행하는 부속 조회에 대한 JOIN이며, 해당하는 전체 행을 찾습니다.

SELECT 
    tbl.colA, 
    tbl.colB, 
    tbl.colC, 
    tbl.colD 
FROM tbl JOIN (
    SELECT 
    colA, 
    colB, 
    MAX(colD) AS maxD 
    FROM tbl 
    GROUP BY colA, colB 
) g ON tbl.colA = g.colA AND tbl.colB = g.colB AND tbl.colD = g.maxD 
+0

이것은 NATURAL JOIN의 좋은 사용 사례입니다. – Benoit

+0

감사합니다. 그리고 질문을 리팩토링 할 때 Benoit에게 감사드립니다 :) 둘 모두에서 열 이름이 같으면 실제로 모든 이름을 "on"으로 지정해야합니까? – momomo

+0

@Hamidam 그렇습니다. 그 중 하나가 기본 키가 아닌 한 모두 'ON' 절에 나열되어 있어야합니다. 예를 들어 'colA'가 유일한 키 값이라면, 당신은'ON tbl.colA = g.colA'를 할 수 있지만, 고유하지 않으므로 고유 한 값을 만들기 위해 필요한만큼의 열을 결합해야합니다. colA , colB, MAX (colD)' –

0

쿼리의 문제 중 하나는 codC의 값을 표시하려고하지만 부분적으로는 그룹에없는 것입니다. 관련 기능없이 값을 표시하려면 그룹별로 수행해야합니다. 따라서, 쿼리를 해결하기 위해이 같은 일을 할 수 있습니다

select n1.* from Number n1 
inner join (select colA, colB, max(colD) as colD from Number GROUP BY colA, colB) n2 on n1.colA = n2.colA and n1.colB = n2.colB and n1.colD = n2.colD 

그것은 각 콜라와 COLB에 대한 최대 (COLD) 모든 행을 선택합니다.

+2

'max (colD)'를 colD로 별칭을 지정하지 않으면 작동하지 않습니다! – Benoit

+0

@Benoit thanks :) –

3

이 작업을 수행 할 수없는 행이 다음했습니다 발견되지 않은 경우

SELECT N1.colA, N1.colB, N1.colC, N1.colD 
    FROM Numbers N1 
    LEFT JOIN Numbers N2 ON N2.colA = N1.colA 
         AND N2.colB = N1.colB 
         AND N2.colD > N1.colD 
    WHERE N2.colA IS NULL; 

좌파 같은 열 A와 B, 더 큰 열 D.과 같은 테이블의 행에 대해 조회 할 것이다 가입 이 반환 행을 속는 경우 DISTINCT을 추가 할 수 있습니다

SELECT * 
    FROM Numbers N 
WHERE NOT EXISTS 
    (SELECT NULL /* or whatever you want, doesn't matter */ 
     FROM Numbers 
     WHERE colA = N.colA 
      AND colB = N.colB 
      AND colD > N.colD 
    ) 

참고 : 컬럼의 최대 값은 D.

이 기술적으로 동일합니다.

관련 문제