2009-08-27 9 views
1

나는이 문제에 대해 내 머리를 꽤 오랫동안 망가 뜨 렸습니다. 또한 다른 질문을 검토했지만 성공하지 못했습니다.SQL - 결과 그룹에서 고유 한 행 선택

문제는 열/행이 여러 개인 결과/목록이 있다는 것입니다.

| 등록 | ID         | DATE                       | 단위 유형

| 005DTHGP               | 172     | 2007-09-11   | MBio
| 005DTHGP               | 1966 | 2006-09-12   | 추적기
| 013DTHGP               | 2281 | 2006-11-01   | 추적기
| 013DTHGP               | 2712 | 2008-05-30   | MBio
| 017DTNGP               | 2404 | 2006-10-20   | 추적기
| 017DTNGP               | 508     | 2007-11-10   | MBio


고유 한 REGISTRATIONS가있는 행을 선택하려고하고 있으며 날짜가 최대 (최신) 인 곳입니다. ID는 DATE에 비례하지 않으므로 ID는 낮은 값일 수 있지만 DATE는 다른 일치하는 행보다 높으며 그 반대도 마찬가지입니다. 따라서 MAX()는 DATE와 ID 모두에서 사용할 수 없으며 그룹화는 작동하지 않습니다.

내가 원하는 결과는 다음과 같습니다.

| 등록 | ID         | DATE                       | 단위 유형

| 005DTHGP               | 172     | 2007-09-11   | MBio
| 013DTHGP               | 2712 | 2008-05-30   | MBio
| 017DTNGP               | 508     | 2007-11-10   | MBio

이 도와주세요!?!?!?!?!?!?

+0

플랫폼은 무엇입니까? Tis는 우리가 제공 할 수있는 SQL과 다른 것을 만듭니다 – gbn

+0

MS SQL 2005/2008 – Theo

답변

1

모든 SQL을 지원하지는 않는 내장 쿼리를 원합니다. T-SQL에서는 PostgreSQL의에서

select r.registration, r.recent, t.id, t.unittype 
from ( 
    select registration, max([date]) recent 
    from @tmp 
    group by 
     registration 
    ) r 
left outer join 
    @tmp t 
on r.recent = t.[date] 
and r.registration = t.registration 
+1

감사합니다. 이것이 내가 질문을 올리기 전에 취한 경로입니다. 성능 문제가 있다는 이유는 작업중인 데이터가 뷰를 통해 생성되기 때문에이 방법은 실제적으로 다른 소스/뷰를 생성한다고 가정하기 때문입니다.9000 가지가 넘는 레코드를 다루고 있습니다. 이 모든 것이 한 줄로 끝나면 좋았을 것입니다. 아아. 감사합니다 – Theo

+0

보기가 확실히 비쌀 수 있습니다 - 아마 임시 테이블/테이블 변수에 필요한 데이터의 스냅 샷을 고려? – Unsliced

0

이 MySQL의에서 작동합니다 :

SELECT registration, id, date, unittype FROM 
    (SELECT registration AS temp_reg, MAX(date) as temp_date 
    FROM table_name GROUP BY registration) AS temp_table 
WHERE registration=temp_reg and date=temp_date 

아이디어는 정확한 날짜와 등록 (필드 그룹에 대상)를 포함하는 단일 행을 던졌습니다 FROM 절에 하위 쿼리를 사용하는 것입니다; 그런 다음 WHERE 절에 올바른 날짜와 등록을 사용하여 같은 행의 다른 필드를 가져옵니다.

+0

을 사용하고 있습니다. 최대 날짜가있는 행의 ID를 제공하지 않습니다. –

+0

... 및 ID + UnitType 열? – gbn

+0

편집 ... –

0

TSQL :

declare @R table 
(
Registration varchar(16), 
ID int, 
Date datetime, 
UnitType varchar(16) 
) 

insert into @R values ('A','1','20090824','A') 
insert into @R values ('A','2','20090825','B') 

select R.Registration,R.ID,R.UnitType,R.Date from @R R 
inner join 
(select Registration,Max(Date) as Date from @R group by Registration) M 
on R.Registration = M.Registration and R.Date = M.Date 

쿼리가 실행되는 방식에 따라 테이블의 행 수천이있는 경우이 비효율적 일 수있다 (즉, 그것은 rowscan 다음 행 당 선택 경우).

0

같은, 그리고 정렬이 필요하지 않습니다 (또는 정렬 상관 없어 그래서 몇 행이)되도록 색인 데이터를 가정이있을 것이다 :

select distinct on (registration), * from whatever order by registration,"date" desc; 

각 행을 등록하고 내림차순으로 정렬하면 각 등록의 최신 날짜가 먼저 표시됩니다. DISTINCT는 뒤 따르는 중복 등록을 버립니다.

0
select registration,ID,date,unittype 
from your_table 
where (registration, date) IN (select registration,max(date) 
          from your_table 
          group by registration)