2009-09-18 2 views
0

Когда группировка - это простой способ получить первое или верхнее значение из столбца. В следующем примере я хочу, чтобы последнее значение в [Текст] было отсортировано по [Дате] по убыванию.SQL: как найти значение столбца Top String в групповом запросе

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

Заранее благодарен.

ответ

1

Если вы хотите, чтобы текст, соответствующий этому [Id] &, что [MaxDate], вы можете сделать это:

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] образуют первичный ключ вы будете иметь один row per (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, не каждый может понять, что ваш последний запрос (с MAX дважды) дает результаты, которые по отдельности не появляются в исходная таблица. Значение MAX (Text) может быть «текстом» идентификатора с другой даты, чем последняя дата. Все, что вы получаете, используя два агрегата MAX - это одна строка для значения Id. Однако вы не получите одну строку исходной таблицы, и редко бывает, что запрос с двумя MAX - это то, что действительно хочет кто-то. –

+0

@Steve, кажется, что вы читали только последнюю часть моего ответа. Я детализировано 3 случая: 1- Он хочет, чтобы текст соответствовал этому идентификатору и этому MaxDate 2- Он хочет (1), но получил более 1 строки за (Id, MaxDate): если это не нормально, и он хочет всегда один , он может использовать 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 
Смежные вопросы