繁体   English   中英

SQL:如何在分组的查询中查找顶部的字符串列值

[英]SQL: How To Find The Top String Column Value in a Grouped Query

当进行分组时,有一种简单的方法可以从列中获取第一个值或最高值。 在下面的示例中,如果按[日期]降序排序,我希望[文本]中的最后一个值。

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

提前致谢。

如果您想要与[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

如果只需要一个Text值,则可以使用MAX或MIN:

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

如果我正确理解您的意见,则任何给定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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM