SQL: как найти значение верхнего строкового столбца в сгруппированном запросе - PullRequest
0 голосов
/ 18 сентября 2009

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

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

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 18 сентября 2009

Если я правильно вас понимаю, для каждого заданного идентификатора может быть несколько дат, а для указанной даты - несколько текстов.

Если вы используете 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
1 голос
/ 18 сентября 2009

Если вам нужен текст, соответствующий этому [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] образуют первичный ключ, у вас будет по одной строке на (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...