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

问题描述 投票:0回答:8

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

    Id,
    Name,
    Date

此表包含同一 id 的多个记录。我想获取具有最大日期的不同 id。我该如何为此编写 sql 查询?

sql sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012
8个回答
20
投票

使用 ROW_NUMBER() 函数和 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

4
投票

如果您只需要

ID
列,不需要其他列,那么您不需要使用
ROW_NUMBER
MAX
或其他任何列。您只需在
Group By
列上执行
ID
即可,因为无论最大日期是多少,您都会获得相同的 ID。

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

如果您需要

ID
Date
列包含最大日期,则只需在
Group By
列上执行
ID
并选择
Max
日期。

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

如果您需要除 1 行外的所有列,其中 Max.日期,然后您可以使用

ROW_NUMBER
MAX
,如其他答案中所述。

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

2
投票

一种方法,使用

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

顺便说一句,

CTE
是一个common-table-expression,类似于命名子查询。我使用它是为了能够通过
row_number
进行过滤。如果需要,此方法允许选择所有列。


1
投票

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


0
投票

尝试使用

Max(Date)
GROUP BY
其他两列(具有重复数据的列)..

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

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

0
投票
select id, max(date) from NameOfYourTable group by id;

0
投票

答案 20 对我有用。我需要每个不同 assetName 以及行中其余记录的最大采样时间。 此示例使用 Python 中的后续语句。

*Python(DataBricks 笔记本)

*sql_statement = ''' SELECT assetName、EngModel、total_cnt、flagged_cnt、diff_EE_avg、flaagged_pct、优先级、开始时间戳、结束时间戳 FROM ( SELECT , ROW_NUMBER() OVER (PARTITION BY assetName ORDER BY End_timestamp desc) AS ROWNUM 来自 ml_dev.ml_prediction_historical ) x WHERE ROWNUM = 1 且 End_timestamp 介于 current_timestamp() - INTERVAL '36' 小时和 current_timestamp() ''' df_telemetry = Spark.sql(sql_statement) 显示(df_遥测)

Output

© www.soinside.com 2019 - 2024. All rights reserved.