복붙노트

[SQL] GROUP BY는 MAX 날짜를 가진

SQL

GROUP BY는 MAX 날짜를 가진

이 코드를 실행하는 문제가있다 :

SELECT * FROM tblpm n 
WHERE date_updated=(SELECT MAX(date_updated) 
FROM tblpm GROUP BY control_number 
HAVING control_number=n.control_number)

기본적으로, 각 컨트롤 번호에 대한 가장 최근의 날짜를 반환합니다. 반환 위의 쿼리는 출력을 수정하지만 37secs 걸립니다. 출력은 도시 된 전.

위의 쿼리를보다 빠르게 실행할 수있는 다른 SQL 절 또는 명령이 있습니까?

미리 감사드립니다.

해결법

  1. ==============================

    1.WHERE 절에 하위 쿼리를 넣고 n.control_number 수단에 제한이 서브 쿼리 여러 번 실행됩니다. 이 상관 하위 쿼리라고하며, 종종 성능 살인자입니다.

    WHERE 절에 하위 쿼리를 넣고 n.control_number 수단에 제한이 서브 쿼리 여러 번 실행됩니다. 이 상관 하위 쿼리라고하며, 종종 성능 살인자입니다.

    그것은 관리 번호 당 최대 날짜를 얻기 위해, FROM 절에 한 번 하위 쿼리를 실행하는 것이 좋습니다.

    SELECT n.* 
    FROM tblpm n 
    INNER JOIN (
      SELECT control_number, MAX(date_updated) AS date_updated
      FROM tblpm GROUP BY control_number
    ) AS max USING (control_number, date_updated);
    
  2. ==============================

    2.그 하위 쿼리 그룹에 대한 필요가 없습니다 ... 조항이 충분할 경우 :

    그 하위 쿼리 그룹에 대한 필요가 없습니다 ... 조항이 충분할 경우 :

    SELECT * FROM tblpm n
    WHERE date_updated=(SELECT MAX(date_updated)
        FROM tblpm WHERE control_number=n.control_number)
    

    또한, 당신은 'date_updated'컬럼에 인덱스를해야합니까? 그건 확실히 도움이 될 것이다.

  3. ==============================

    3.그룹화를 사용하지 않는 또 다른 방법 :

    그룹화를 사용하지 않는 또 다른 방법 :

    SELECT * FROM tblpm n 
      WHERE date_updated=(SELECT date_updated FROM tblpm n 
                            ORDER BY date_updated desc LIMIT 1)
    
  4. ==============================

    4.빠르고 쉬운 갖는 :

    빠르고 쉬운 갖는 :

    SELECT * FROM tblpm n 
    FROM tblpm GROUP BY control_number 
    HAVING date_updated=MAX(date_updated);
    

    HAVING의 맥락에서, MAX는 각 그룹의 최대를 찾습니다. 각 그룹의 최신 항목이 date_updated 만족 = 최대 (date_updated). 그룹 내 최신의 넥타이가 있다면, 모두가 하나가 반환 된 테이블에 나타납니다 의한 HAVING 필터하지만, GROUP을 전달합니다.

  5. from https://stackoverflow.com/questions/18221999/group-by-having-max-date by cc-by-sa and MIT license