我有一张类似的表格:
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
吗?
我是否需要自己加入表格,以便能够为所有max(Time)
列出ID
?
答案 0 :(得分:4)
如果您希望保留更多列,则可以使用具有ROW_NUMBER
功能的CTE:
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
答案 1 :(得分:2)
使用MAX
功能查找最新时间。
<强>查询强>
SELECT ID, Name,
MAX(Time) AS [Time]
FROM your_table_name
GROUP BY ID, Name;
答案 2 :(得分:1)
您可以使用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 / NAME对。根据不同的数据,您将得到:
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
强>
答案 3 :(得分:1)
您的问题并未表明您希望根据NAME
获得输出,而只是ID
。因此,以前的答案在技术上是错误的。你应该使用:
SELECT ID, AGGREGATEFUNCTION(Name), MAX(Time) AS [Time]
FROM Your_Table
GROUP BY ID
这意味着如果您的名字不同,则他们不会创建单独的组。
它也完全符合您的要求。