2014-05-15 1 views
1

나는이 일을 성공적으로 수행하는 데 어려움을 겪었습니다.T-SQL은 다른 사람의 수에 기초하여 하나의 필드를 반환합니다.

계약 번호, 시작 날짜, 일련 번호 및 날짜 스탬프가 포함 된 테이블이 있습니다. 이들은 많은 것 : 많은 것.

내가 달성하고자하는 것은 고유 일련 번호가 가장 많은 각 개별 계약 번호의 시작 날짜와 해당 날짜가 유효한 최신 날짜 스탬프를 반환하는 것입니다.

이것은 T-SQL 전문가들에게 분명히 알 수 있듯이 일련 번호가 가장 큰 하나의 계약 번호 만 반환합니다. 아무도 내가 뭘 잘못하고 있다고 말할 수 있습니까?

SELECT TOP (1) 
    [Contract ID], [Item Begin Date] AS Start_Date, 
    COUNT([Serial Number]) AS CountSerials, 
    Datestamp 
FROM 
    SourceTable 
GROUP BY 
    [Contract ID], [Item Begin Date], Datestamp 
HAVING  
    ([Item Begin Date] > CONVERT(DATETIME, '1900-01-01 00:00:00', 102)) 
ORDER BY 
    CountSerials DESC, Datestamp DESC 

건배, 알렉스

+2

힌트 : CTE 및 row_number() 사용 –

+0

사용중인 SQLServer의 버전은 무엇입니까? – Serpiton

답변

0

당신은 (TOP (1) 또는 데르로를 사용하지 않고) 임시 테이블에 그것을 넣을 수 있습니다 : 나는 과정에서 일부 테이블 이름을 변경 ,

if exists (select * from tempdb.sys.tables where name = '##tmp') 
    drop table ##tmp 

    SELECT * into ##tmp 
    from 
    (
    select 
    [Contract_ID], [Begin_Date] AS Start_Date, 
    COUNT([serials]) AS CountSerials, 
    Datestamp 
FROM 
    SourceTable 
GROUP BY 
    [Contract_ID], [begin_date], Datestamp 
HAVING  
    [begin_date] > CONVERT(DATETIME, '1900-01-01 00:00:00', 102) 
    ) a 

    select contract_id,Start_Date, max(countserials) as MAXCOUNT, Datestamp from ##tmp 
    group by contract_id,Start_Date,Datestamp 
0

집계를 사용하여 하위 쿼리를 수행하고 원하는 결과를 추출 할 수 있습니다.

SELECT distinct * 
FROM 
(
    Select 
    [Contract ID], [Item Begin Date] AS Start_Date, 
    COUNT([Serial Number]) OVER(PARTITION BY [Contract ID]) AS CountSerials, 
    datestamp, 
    MAX(Datestamp) OVER (PARTITION BY [Contract ID]) maxdatestamp 
    FROM 
     SourceTable 
    WHERE  
     ([Item Begin Date] > CONVERT(DATETIME, '1900-01-01 00:00:00', 102)) 
) x 
WHERE 
datestamp=maxdatestamp 
+0

이는 그룹당 하나가 아닌 한 행만 반환합니다. – Serpiton

관련 문제