[SQL] MySQL의 쿼리, MAX () + GROUP BY
SQLMySQL의 쿼리, 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.(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.
select * from ( select `pid`, `timestamp`, `cost`, `rid` from theTable order by `timestamp` desc ) as mynewtable group by mynewtable.`rid` order by mynewtable.`timestamp`
희망 나는 도움이!
-
==============================
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.나는 제거와 타임 스탬프에 인덱스를 만들었습니다.
나는 제거와 타임 스탬프에 인덱스를 만들었습니다.
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.당신은 또한 같은 서브 쿼리 수 :
당신은 또한 같은 서브 쿼리 수 :
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.당신이이 가입 피하고 싶은 경우에, 당신은 사용할 수 있습니다 :
당신이이 가입 피하고 싶은 경우에, 당신은 사용할 수 있습니다 :
SELECT pid, rid FROM theTable t1 WHERE t1.pid IN ( SELECT MAX(t2.pid) FROM theTable t2 GROUP BY t2.rid);
-
==============================
7.시험:
시험:
select pid,cost, timestamp, rid from theTable order by timestamp DESC limit 2;
from https://stackoverflow.com/questions/5657446/mysql-query-max-group-by by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 삽입 쿼리 C #을 사용 (0) | 2020.04.20 |
---|---|
[SQL] SQL 선택 다가오는 생일 (0) | 2020.04.20 |
[SQL] 오라클에 연결하여 그룹의 여러 행 [중복] (0) | 2020.04.20 |
[SQL] 저장 프로 시저 거래-SQL SQL 서버 내에서 결과 세트에 대한 액세스 (0) | 2020.04.20 |
[SQL] 와 DELETE SQL은 것은 WHERE 조건에 대한 다른 테이블 가입 (0) | 2020.04.20 |