如何根据最大日期获取不同的记录?

时间:2014-04-28 08:56:45

标签: sql sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012

我正在使用Sql server 2008.i有一个包含以下列的表,

    Id,
    Name,
    Date

这个表包含多个相同id.i的记录想要得到具有最大date的独立id。我可以为此编写sql查询吗?

7 个答案:

答案 0 :(得分:8)

使用ROW _ NUMBER() function和PARTITION BY子句。像这样:

SELECT Id, Name, Date FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Date desc) AS ROWNUM 
    FROM [MyTable]
) x WHERE ROWNUM = 1

答案 1 :(得分:2)

如果您只需要ID列,则不需要其他列,那么您无需使用ROW_NUMBERMAX或其他任何内容。您只需Group ByID列,因为无论最大日期是什么,您都会获得相同的ID。

SELECT ID FROM table GROUP BY ID
--OR
SELECT DISTINCT ID FROM table

如果您需要具有最长日期的IDDate列,则只需在Group By列上执行ID并选择Max日期。

SELECT ID, Max(Date) AS Date
FROM table 
GROUP BY ID

如果你需要所有的列,但是1行有Max。如果是日期,您可以按照其他答案中提到的ROW_NUMBERMAX进行操作。

SELECT *
FROM   table AS M
WHERE  Exists(
        SELECT 1
        FROM   table
        WHERE  ID = M.ID
        HAVING M.Date = Max(Date)
        )

答案 2 :(得分:1)

单向,使用ROW_NUMBER

With CTE As
(
    SELECT Id, Name, Date, Rn = Row_Number() Over (Partition By Id
                                                   Order By Date DESC)
    FROM dbo.TableName
)
SELECT Id --, Name, Date 
FROM CTE
WHERE Rn = 1

如果可能有多个最大日期,而您希望所有内容都可以使用DENSE_RANK

这里概述了sql-server的排名功能:http://technet.microsoft.com/en-us/library/ms189798.aspx

顺便说一下,CTEcommon-table-expression,类似于命名的子查询。我使用它可以按row_number进行过滤。如果需要,此方法允许选择所有列。

答案 3 :(得分:1)

  

选择“最大日期”作为“最大日期”               从表               按ID分组               按ID

排序

答案 4 :(得分:0)

尝试使用Max(Date)GROUP BY其他两列(具有重复数据的列)。

SELECT ID, Max(Date) as date, Name
FROM YourTable
GROUP BY ID, Name

答案 5 :(得分:0)

您可以尝试使用此

DECLARE  @T TABLE(ID INT, NAME VARCHAR(50),DATE DATETIME) 
 INSERT INTO @T VALUES(1,'A','2014-04-20'),(1,'A','2014-04-28')
,(2,'A2','2014-04-22'),(2,'A2','2014-04-24')
,(3,'A3','2014-04-20'),(3,'A3','2014-04-28')
,(4,'A4','2014-04-28'),(4,'A4','2014-04-28')
,(5,'A5','2014-04-28'),(5,'A5','2014-04-28')

SELECT T.ID FROM @T T 
WHERE T.DATE=(SELECT MAX(A.DATE) 
              FROM @T A 
              WHERE A.ID=T.ID 
              GROUP BY A.ID ) 
GROUP BY T.ID

答案 6 :(得分:0)

select id, max(date) from NameOfYourTable group by id;
相关问题