2011-04-05 4 views
26

의 마지막 독특한 세트를 가져옵니다 : 유일하게 고유 한 값이 ID 즉, 기본 키에있는이 표에서나는 데이터베이스에는 다음과 같은 열을 포함하는 테이블이 기록

id code value datetime timestamp 

합니다.

datetime 값을 기반으로이 테이블의 마지막 고유 레코드 집합을 검색하려고합니다. 예를 들어, 아래 생각한 것은 내 테이블

id code value datetime    timestamp 
1 1023 23.56 2011-04-05 14:54:52 1234223421 
2 1024 23.56 2011-04-05 14:55:52 1234223423 
3 1025 23.56 2011-04-05 14:56:52 1234223424 
4 1023 23.56 2011-04-05 14:57:52 1234223425 
5 1025 23.56 2011-04-05 14:58:52 1234223426 
6 1025 23.56 2011-04-05 14:59:52 1234223427 
7 1024 23.56 2011-04-05 15:00:12 1234223428 
8 1026 23.56 2011-04-05 15:01:14 1234223429 
9 1025 23.56 2011-04-05 15:02:22 1234223430 

내가 ID를 4, 7, 8 레코드를 검색 할, 9 즉 (날짜 시간 값 기준) 구분 코드 레코드의 마지막 세트입니다. 내가 강조한 것은 단순히이 테이블이 수백만 개의 레코드와 수백 개의 개별 코드 값을 포함하기 때문에 내가 성취하고자하는 것의 한 예일뿐입니다.

이 작업을 수행하기 위해 사용할 수있는 SQL 문은 무엇입니까? 단일 SQL 문으로 처리 할 수없는 것 같습니다. 내 데이터베이스는 MySQL 5입니다.

답변

50

이 방법이 유용 할 것입니다.

SELECT * 
FROM [tableName] 
WHERE id IN (SELECT MAX(id) FROM [tableName] GROUP BY code) 

ID가 AUTO_INCREMENT 경우, 가장 최근의 날짜는 가장 높은 ID를해야합니다으로, 훨씬 더 많은 비용이 계산되는 날짜에 대해 걱정할 필요가 없습니다.

업데이트 : 성능의 관점에서는 많은 수의 레코드를 처리 할 때 idcode 열 색인을 확인합니다. id이 기본 키인 경우이 키가 기본 제공되지만 codeid을 포함하는 비 클러스터형 인덱스를 추가해야 할 수 있습니다.

+1

자동 증가의 경우 datetime 테스트를 피하기 위해 +1 ... 저는 자유롭게 형식을 다시 잡았습니다. – krtek

+0

매력처럼 작동합니다! 이것에 대해 고마워. –

+1

@smdrager, Very Nice ... 내 시간을 저장했습니다. – vissu

0

나는이 같은 노력 할게요 :

select * from table 
where id in (
    select id 
    from table 
    group by code 
    having datetime = max(datetime) 
) 

(면책 조항 :이 테스트되지 않은) 더 큰 날짜가있는 행은 또한 더 큰 ID가있는 경우, smdrager에 의해 제안 된 솔루션입니다

을 빨리.

5

이 시도 :

SELECT * 
    FROM <YOUR_TABLE> 
WHERE (code, datetime, timestamp) IN 
(
    SELECT code, MAX(datetime), MAX(timestamp) 
    FROM <YOUR_TABLE> 
    GROUP BY code 
) 
+0

테이블에 기본 키가 있기 때문에 복잡한 where 절을 사용할 필요가 없다. 내 대답을 보라. – krtek

+0

@Krtek : 합의했는데, id가 자동 증가라는 가정이 필요합니다. – Chandu

+0

전혀, smdrager 대답 않습니다, 내 하위 쿼리'having' 절 때문에 사용하는 좋은 ID를 반환합니다 – krtek

1

그것은이고 이전 게시물 있지만, 큰 테이블 @smdrager 대답 테스트가 매우 느렸다. 이 문제는 "어디에서"대신 "내부 조인"을 사용하여 수정되었습니다.

SELECT * 
FROM [tableName] as t1 
INNER JOIN (SELECT MAX(id) as id FROM [tableName] GROUP BY code) as t2 
ON t1.id = t2.id 

정말 빠르게 작동했습니다.

+0

고마워요. 다음에 이것을 사용할 때 시도해 보겠습니다. –

관련 문제