2009-09-18 3 views
0

그룹화 할 때 열의 첫 번째 값이나 최상위 값을 가져 오는 간단한 방법이 있습니다. 다음 예제에서는 [Date]를 내림차순으로 정렬하는 경우 [Text]의 마지막 값을 원합니다.SQL : 그룹화 된 쿼리에서 최상위 문자열 열 값을 찾는 방법

SELECT 
    [Id], 
    MAX([Date]), 
    TOP 1 [Text], <-- How do I do do this 
    COUNT(*) 
FROM 
    [ExampleTable] 
GROUP BY [Id] 
ORDER BY [Date] DESC 

미리 감사드립니다.

답변

1

당신은 텍스트 [MaxDate], 당신이 할 수있는 그 [ID] &에 해당합니다 : [ID] & [날짜] 기본 키를 형성하는 경우

SELECT T2.*, T1.Text 
FROM [ExampleTable] T1 
    JOIN (SELECT 
       [Id], 
       MAX([Date]) MaxDate, 
       COUNT(*) Cnt 
      FROM 
       [ExampleTable] 
     GROUP BY [Id]) T2 
    ON T1.Id = T2.Id AND T1.Date = T2.MaxDate 
ORDER BY [Date] DESC 

당신이 하나가됩니다 (Id, Date) 당 행이 다른 많은 현명한. 당신은 정말 하나를 원하거나 당신은 당신이 MAX 또는 MIN을 사용하여 텍스트를 단지 값을 원하는 경우

SELECT T2.*, MAX(T1.Text) Text -- or MIN(T1.Text) 
FROM [ExampleTable] T1 
    JOIN (SELECT 
       [Id], 
       MAX([Date]) MaxDate, 
       COUNT(*) Cnt 
      FROM 
       [ExampleTable] 
     GROUP BY [Id]) T2 
    ON T1.Id = T2.Id AND T1.Date = T2.MaxDate 
GROUP BY T2.* 
ORDER BY [Date] DESC 

:: MAX 또는 MIN를 사용하는 다른 제약을 두거나 경우

SELECT 
    [Id], 
    MAX([Date]), 
    MAX([Text]), 
    COUNT(*) 
FROM 
    [ExampleTable] 
GROUP BY [Id] 
ORDER BY [Date] DESC 
+1

najmeddine 작업에 도착를 사용하는 경우, 모든 사람이 (2 회 MAX와) 마지막 쿼리가 개별적으로 표시되지 않는 결과를 실현 할 수있다 소스 테이블. MAX (텍스트) 값은 최신 날짜와 다른 날짜의 ID의 "텍스트"일 수 있습니다. 두 개의 최대 집계를 사용하여 얻는 것은 Id 값 당 하나의 행입니다. 하지만 원본 테이블에서 한 행을 얻지는 못합니다. 두 MAX 쿼리가 실제로 원하는 것입니다. –

+0

@ 스티브, 내 대답의 마지막 부분 만 읽는 것 같습니다. 자세한 3 가지 경우 : - 그는 해당 Id & that에 해당하는 텍스트를 원합니다. MaxDate 2 (Id, MaxDate) 당 1 행 이상이 필요합니다. 괜찮지 않고 항상 1을 원하면 , 그는 Min 또는 Max를 사용할 수 있습니다. 3 그는 임의의 텍스트 ('텍스트의 값'이라고 말했습니다)를 원하고 Min 또는 Max를 사용할 수 있습니다. – manji

1

내가 이해한다면 당신은 정확하게, 주어진 ID에 대해 여러 날짜가있을 수 있으며 주어진 날짜에 대해 여러 텍스트가있을 수 있습니다.

당신은 SQL Server가

2005 나는이

DECLARE @Table TABLE(
     ID INT, 
     DDATE DATETIME, 
     VAL VARCHAR(MAX) 
) 

INSERT INTO @Table (ID,DDATE,VAL) SELECT 1, '01 Jan 2009', '1' 
INSERT INTO @Table (ID,DDATE,VAL) SELECT 1, '01 Feb 2009', '2' 
INSERT INTO @Table (ID,DDATE,VAL) SELECT 1, '01 Feb 2009', '3' 
INSERT INTO @Table (ID,DDATE,VAL) SELECT 2, '01 Jan 2009', '4' 


SELECT ID, 
     DDATE, 
     VAL, 
     ROWNUMBER 
FROM (
      SELECT t.ID, 
        t.DDATE, 
        t.VAL, 
        ROW_NUMBER() OVER (PARTITION BY t.ID ORDER BY DDATE) ROWNUMBER 
      FROM @Table t INNER JOIN 
        (
         SELECT ID, 
           MAX(DDATE) AS MAXDATE 
         FROM @Table 
         GROUP BY ID 
        ) md ON t.ID = md.ID 
          AND t.DDATE = md.MAXDATE 
     ) RowNumber 
WHERE RowNumber.ROWNUMBER = 1 
관련 문제