2013-12-09 3 views
1

에서 값을 반복되지 않는 선택하려면쿼리 나 테이블이 다음과 같이 구조화 한 테이블

ID  Name    RunDate 
10001  Item 1   12/09/2013 02:11:47 
10002  Item 2   12/09/2013 01:13:25 
10001  Item 1   12/09/2013 01:11:37 
10007  Item 7   12/08/2013 11:02:04 
10001  Item 1   12/08/2013 10:25:00 

내 문제는이 테이블이 메일 그룹에 전자 메일로 전송하고 이메일이 너무 커서하게 될 것입니다 테이블에 수백 가지 이상의 행이 있기 때문입니다. 내가 성취하고자하는 것은 DISTINCT ID가 최신 RunDate 만 보여주는 레코드 만 표시하는 것입니다.

ID  Name    RunDate 
10001  Item 1   12/09/2013 02:11:47 
10002  Item 2   12/09/2013 01:13:25 
10007  Item 7   12/08/2013 11:02:04 

어떻게하면됩니까? 집계에별로 좋지 않아 DISTINCT를 사용했지만 항상 쿼리가 엉망입니다.

감사합니다. 구별되어야하고 max()을 사용해야하는 값을 기준으로

답변

2

은 모든 열을 기준으로 그룹화가 필요하지 않기 때문에 더 유연를 얻을 수 :

;WITH x AS 
(
    SELECT ID, Name, RunDate, /* other columns, */ 
    rn = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY RunDate DESC) 
    FROM dbo.TableName 
) 
SELECT ID, Name, RunDate /* , other columns */ 
    FROM x 
    WHERE rn = 1 
    ORDER BY ID; 

(Name은 실제로 그룹화 할 필요가 없으므로 사실이 테이블에 있지 않아야하며 GROUP BY 솔루션에 대한 다음 후속 질문은 거의 항상 "<column x> 및를 어떻게 추가합니까?은 출력에 값이 다르므로 GROUP BY에 추가 할 수 없습니까? ")

+0

고맙습니다! 이것은 매우 도움이됩니다! 그래도 질문을 따르십시오 ... 각 그룹/파티션에 포함 된 총 행 수를 출력하려면 어떻게해야합니까? 이것을 할 수있는 방법이 있습니까? – Smiley

+1

확실히, 내부에', c = COUNT (*) OVER (PARTITION BY ID)'를 추가하고 외부에', c'를 추가하십시오. –

+0

아! 유쾌한 !!! 무리 감사!!!! – Smiley

4

그룹은 가장 최근의 날짜

select id, name, max(rundate) as rundate 
from your_table 
group by id, name