查询最大时间(最新)按id的SQL Server

查询最大时间(最新)按id的SQL Server

问题描述:

我有一个类似的表:查询最大时间(最新)按id的SQL Server

ID  | Name | Time 
-------|---------|----------------------------- 
111 | AAA  | 2015-11-05 15:39:24.000 
222 | BBB  | 2015-11-04 11:29:11.000 
111 | AAA  | 2015-11-02 13:12:10.000 
333 | CCC  | 2015-11-05 15:39:24.000 
111 | AAA  | 2015-11-01 15:39:24.000 

我想获得最新的Time为每ID。我的输出看起来是这样的:

ID  | Name | Time 
-------|---------|----------------------------- 
111 | AAA  | 2015-11-05 15:39:24.000 
222 | BBB  | 2015-11-04 11:29:11.000 
333 | CCC  | 2015-11-05 15:39:24.000 

请帮我制定查询!我可以用max(Time)得到最新的Time吗? 我是否需要加入表格以便能够列出所有ID s的max(Time)

+2

'select max(time),id,namename from tablename group by id,name' – wiretext

如果你想保持你可以使用一个CTE与ROW_NUMBER功能列:

WITH CTE AS 
(
    SELECT Id, Name, Time, OtherColumns..., 
      RN = ROW_NUMBER() OVER (PARTITION BY ID Order By Time DESC) 
    FROM dbo.TableName 
) 
SELECT Id, Name, Time, OtherColumns... 
FROM CTE 
WHERE RN = 1 

如果有可能存在具有相同复式行每个ID的最大时间,并且您希望所有这些都代替ROW_NUMBERDENSE_RANKRanking Functions

+0

'ROW_NUMBER()'作为rn将会跳过具有相同MAX时间的数据,如:111,'AAA','2015-11-05 15:39:24.000'和111,'DDD','2015-11 -05 15:39:24.000''。 ** RANK()**代替怎么样? [演示](https://data.stackexchange.com/stackoverflow/query/384590) – lad2025

+1

@ lad2025:好点,编辑我的答案 –

+0

谢谢你教我新东西!太棒了! – DDan

可以使用MAX功能:

SELECT ID, Name, MAX([Time]) AS [Time] 
FROM your_table 
GROUP BY ID, Name ; 

LiveDemo

输出:

╔═════╦══════╦═════════════════════╗ 
║ ID ║ Name ║  Time   ║ 
╠═════╬══════╬═════════════════════╣ 
║ 111 ║ AAA ║ 2015-11-05 15:39:24 ║ 
║ 222 ║ BBB ║ 2015-11-04 11:29:11 ║ 
║ 333 ║ CCC ║ 2015-11-05 15:39:24 ║ 
╚═════╩══════╩═════════════════════╝ 

这里有一个陷阱,虽然,你提供的数据具有相同的ID /名称对。不同的数据,你会得到:

INSERT INTO #Your_Table(ID,Name,Time) VALUES (111,'AAA','2015-11-05 15:39:24.000'); 
INSERT INTO #Your_Table(ID,Name,Time) VALUES (222,'BBB','2015-11-04 11:29:11.000'); 
INSERT INTO #Your_Table(ID,Name,Time) VALUES (111,'AAA','2015-11-02 13:12:10.000'); 
INSERT INTO #Your_Table(ID,Name,Time) VALUES (333,'CCC','2015-11-05 15:39:24.000'); 
INSERT INTO #Your_Table(ID,Name,Time) VALUES (111,'DDD','2015-11-01 15:39:24.000'); 

输出:

╔═════╦══════╦═════════════════════╗ 
║ ID ║ Name ║  Time   ║ 
╠═════╬══════╬═════════════════════╣ 
║ 111 ║ AAA ║ 2015-11-05 15:39:24 ║ 
║ 222 ║ BBB ║ 2015-11-04 11:29:11 ║ 
║ 333 ║ CCC ║ 2015-11-05 15:39:24 ║ 
║ 111 ║ DDD ║ 2015-11-01 15:39:24 ║ 
╚═════╩══════╩═════════════════════╝ 

如果你想实际行,而不是分组使用像here结果:

WITH cte AS 
(
    SELECT ID, MAX([Time]) AS [Time] 
    FROM #your_table 
    GROUP BY ID 
) 
SELECT t.* 
FROM #your_table t 
JOIN cte c 
    ON c.ID = t.ID 
AND c.[Time] = t.[Time] 

LiveDemo2

使用MAX函数查找最新时间。

查询

SELECT ID, Name, 
    MAX(Time) AS [Time] 
FROM your_table_name 
GROUP BY ID, Name; 
+0

感谢您提供简单快捷的解决方案! – DDan

你的问题并没有说你想得到你的输出基于NAME,只是ID。因此,以前的答案在技术上是错误的。你应该使用:

SELECT ID, AGGREGATEFUNCTION(Name), MAX(Time) AS [Time] 
FROM Your_Table 
GROUP BY ID 

这意味着如果你的名字不同,那么他们不会创建一个单独的组。

它也符合您的要求。

+0

在你说'因此之前的答案在技术上是错误的。'检查你的答案。它甚至不能用于语法错误:'Column'Name'在选择列表中是无效的,因为它不包含在聚合函数或GROUP BY子句中。' – lad2025

+0

请注意,我不是说它会不工作,只是你在分组他不是要求的信息,这可能会导致错误的结果。我忽略选择名称列,感谢您的更正。这个想法是完全符合OP的要求。你的查询是好的,我正在看这种方法,因为它是**不承担任何**。然而,OP在选择时仅仅依靠ID和想要Name来反驳他的问题。 –

+0

随着你的查询数据'111 BBB 2015-01-01'和'111 AAA 2015-05-01',他会得到'111 BBB 2015-05-01'。问题在于,OP想要实际的行或合计的名称 – lad2025