查询最大时间(最新)按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)
?
如果你想保持你可以使用一个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_NUMBER
和DENSE_RANK
。 Ranking Functions
可以使用MAX
功能:
SELECT ID, Name, MAX([Time]) AS [Time]
FROM your_table
GROUP BY ID, Name ;
输出:
╔═════╦══════╦═════════════════════╗
║ 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]
使用MAX
函数查找最新时间。
查询
SELECT ID, Name,
MAX(Time) AS [Time]
FROM your_table_name
GROUP BY ID, Name;
感谢您提供简单快捷的解决方案! – DDan
你的问题并没有说你想得到你的输出基于NAME
,只是ID
。因此,以前的答案在技术上是错误的。你应该使用:
SELECT ID, AGGREGATEFUNCTION(Name), MAX(Time) AS [Time]
FROM Your_Table
GROUP BY ID
这意味着如果你的名字不同,那么他们不会创建一个单独的组。
它也符合您的要求。
在你说'因此之前的答案在技术上是错误的。'检查你的答案。它甚至不能用于语法错误:'Column'Name'在选择列表中是无效的,因为它不包含在聚合函数或GROUP BY子句中。' – lad2025
请注意,我不是说它会不工作,只是你在分组他不是要求的信息,这可能会导致错误的结果。我忽略选择名称列,感谢您的更正。这个想法是完全符合OP的要求。你的查询是好的,我正在看这种方法,因为它是**不承担任何**。然而,OP在选择时仅仅依靠ID和想要Name来反驳他的问题。 –
随着你的查询数据'111 BBB 2015-01-01'和'111 AAA 2015-05-01',他会得到'111 BBB 2015-05-01'。问题在于,OP想要实际的行或合计的名称 – lad2025
'select max(time),id,namename from tablename group by id,name' – wiretext