복붙노트

[SQL] MySQL의 쿼리, MAX () + GROUP BY

SQL

MySQL의 쿼리, MAX () + GROUP BY

다 프트 SQL 질문입니다. 내가 가진 그래서 같은 테이블 ( 'PID는'자동 증가 차 COL입니다)

CREATE TABLE theTable (
    `pid` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    `timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `cost` INT UNSIGNED NOT NULL,
    `rid` INT NOT NULL,
) Engine=InnoDB;

실제 테이블 데이터 :

INSERT INTO theTable (`pid`, `timestamp`, `cost`, `rid`)
VALUES
  (1, '2011-04-14 01:05:07', 1122, 1),
  (2, '2011-04-14 00:05:07', 2233, 1),
  (3, '2011-04-14 01:05:41', 4455, 2),
  (4, '2011-04-14 01:01:11', 5566, 2),
  (5, '2011-04-14 01:06:06', 345, 1),
  (6, '2011-04-13 22:06:06', 543, 2),
  (7, '2011-04-14 01:14:14', 5435, 3),
  (8, '2011-04-14 01:10:13', 6767, 3)
;

나는 각각의 제거 (독특한 RID 당 1 개 결과)에 대한 최신 행의 PID를 얻을 싶어요. 샘플 데이터의 경우, 내가 좋아하는 것 :

pid | MAX(timestamp)      | rid
-----------------------------------
5   | 2011-04-14 01:06:06 | 1
3   | 2011-04-14 01:05:41 | 2
7   | 2011-04-14 01:14:14 | 3

나는 다음과 같은 쿼리를 실행 시도했다 :

SELECT MAX(timestamp),rid,pid FROM theTable GROUP BY rid

내가 얻을 :

max(timestamp)     ; rid; pid
----------------------------
2011-04-14 01:06:06; 1  ; 1
2011-04-14 01:05:41; 2  ; 3
2011-04-14 01:14:14; 3  ; 7

PID는 항상 사용되는 2 RID가 처음 사용될 때, 행 / PID 7은 처음 3 없애 1 frst 시간이 1이 사용되는 제거되는 PID / RID (행, 열 / PID 3 PID의 선두로부터 인 반환 ). 각각의 제거에 대한 최대 타임 스탬프를 반환 있지만, PID를 원래의 테이블에서 타임 스탬프에 대한 PID를가 없습니다. 어떤 쿼리는 나에게 내가 찾고 결과를 줄 것이다?

해결법

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

    1.(PostgreSQL의 9.something 시험)

    (PostgreSQL의 9.something 시험)

    (가) 제거 및 타임 스탬프 확인합니다.

    select rid, max(timestamp) as ts
    from test
    group by rid;
    
    1   2011-04-14 18:46:00
    2   2011-04-14 14:59:00
    

    여기에 가입.

    select test.pid, test.cost, test.timestamp, test.rid
    from test
    inner join 
        (select rid, max(timestamp) as ts
        from test
        group by rid) maxt
    on (test.rid = maxt.rid and test.timestamp = maxt.ts)
    
  2. ==============================

    2.

    select *
    from (
        select `pid`, `timestamp`, `cost`, `rid`
        from theTable 
        order by `timestamp` desc
    ) as mynewtable
    group by mynewtable.`rid`
    order by mynewtable.`timestamp`
    

    희망 나는 도움이!

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

    3.

    SELECT t.pid, t.cost, to.timestamp, t.rid
    FROM test as t
    JOIN (
        SELECT rid, max(tempstamp) AS maxtimestamp
        FROM test GROUP BY rid
    ) AS tmax
        ON t.pid = tmax.pid and t.timestamp = tmax.maxtimestamp
    
  4. ==============================

    4.나는 제거와 타임 스탬프에 인덱스를 만들었습니다.

    나는 제거와 타임 스탬프에 인덱스를 만들었습니다.

    SELECT test.pid, test.cost, test.timestamp, test.rid
    FROM theTable AS test
    LEFT JOIN theTable maxt 
    ON maxt.rid = test.rid
    AND maxt.timestamp > test.timestamp
    WHERE maxt.rid IS NULL 
    

    보기 행 0 - 2 (3 총, 쿼리 0.0104 초를했다)

    이 방법 theTable (테스트)에서 원하는 모든 값을 선택할 것이며, 모두 동일한 RID와 테스트의 하나 이상 소인 자체 (maxt)를 접합 떠났다. maxt 될 NULL에 값 - 우리가 찾고있는 무엇 - 타임 스탬프가 이미 테스트에서 가장 높은 한 경우에는 maxt에 일치가 없습니다. 이제 우리는 절 maxt.rid이 NULL 또는 maxt의 다른 열은 IS WHERE 사용합니다.

  5. ==============================

    5.당신은 또한 같은 서브 쿼리 수 :

    당신은 또한 같은 서브 쿼리 수 :

    SELECT ( SELECT MIN(t2.pid)
             FROM test t2
             WHERE t2.rid = t.rid
               AND t2.timestamp = maxtimestamp
           ) AS pid 
         , MAX(t.timestamp) AS maxtimestamp
         , t.rid
    FROM test t
    GROUP BY t.rid
    

    당신이 원한다면하지만이 방법은, 당신은 하나 더 하위 쿼리가 필요합니다 등 표시 컬럼에 포함 된 비용

    그래서,에 의해 가입이 그룹은 더 나은 솔루션입니다.

  6. ==============================

    6.당신이이 가입 피하고 싶은 경우에, 당신은 사용할 수 있습니다 :

    당신이이 가입 피하고 싶은 경우에, 당신은 사용할 수 있습니다 :

    SELECT pid, rid FROM theTable t1 WHERE t1.pid IN ( SELECT MAX(t2.pid) FROM theTable t2 GROUP BY t2.rid);
    
  7. ==============================

    7.시험:

    시험:

    select pid,cost, timestamp, rid from theTable order by timestamp DESC limit 2;
    
  8. from https://stackoverflow.com/questions/5657446/mysql-query-max-group-by by cc-by-sa and MIT license