我正在使用 Sql server 2008.i 有一个包含以下列的表,
Id,
Name,
Date
此表包含同一 id 的多个记录。我想获取具有最大日期的不同 id。我该如何为此编写 sql 查询?
使用 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
如果您只需要
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)
)
一种方法,使用
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
进行过滤。如果需要,此方法允许选择所有列。
选择最大(日期)作为“最大日期” 从表 按 ID 分组 按 ID 订购
尝试使用
Max(Date)
和 GROUP BY
其他两列(具有重复数据的列)..
SELECT ID, Max(Date) as date, Name
FROM YourTable
GROUP BY ID, Name
你可以尝试一下这个
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
select id, max(date) from NameOfYourTable group by id;
答案 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_遥测)