按id SQL Server查询最长时间(最近)

按id SQL Server查询最长时间(最近),sql,sql-server,Sql,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

我有一张类似的表格:

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
我想获得每个
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)
获取最新的
时间吗?

我是否需要将表本身连接起来才能列出所有
ID
s的
max(Time)

您可以使用
max
功能:

SELECT ID, Name, MAX([Time]) AS [Time]
FROM your_table
GROUP BY ID, Name ;
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  ║ 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 ║        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 ║
╚═════╩══════╩═════════════════════╝
不过有一个问题,您提供的数据具有相同的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 ║
╚═════╩══════╩═════════════════════╝
╔═════╦══════╦═════════════════════╗
║ 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 ║
╚═════╩══════╩═════════════════════╝
如果您想要实际的行而不是分组结果,请使用:


您可以使用
MAX
功能:

SELECT ID, Name, MAX([Time]) AS [Time]
FROM your_table
GROUP BY ID, Name ;
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  ║ 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 ║        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 ║
╚═════╩══════╩═════════════════════╝
不过有一个问题,您提供的数据具有相同的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 ║
╚═════╩══════╩═════════════════════╝
╔═════╦══════╦═════════════════════╗
║ 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 ║
╚═════╩══════╩═════════════════════╝
如果您想要实际的行而不是分组结果,请使用:


使用
MAX
功能查找最新时间

查询

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

使用
MAX
功能查找最新时间

查询

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

如果要保留更多的列,可以使用带有
行号
功能的CTE:

SELECT ID, Name, MAX([Time]) AS [Time]
FROM your_table
GROUP BY ID, Name ;
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的最大时间相同,并且您希望所有行都使用
行数
替换为
密集列

如果要保留更多的列,可以使用带有
行号的CTE
功能:

SELECT ID, Name, MAX([Time]) AS [Time]
FROM your_table
GROUP BY ID, Name ;
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的最大时间相同,并且您希望所有行都使用
行数
替换为
密集列

您的问题并不是说您希望根据
名称
获取输出,而是
ID
。因此,前面的答案在技术上是错误的。您应该使用:

SELECT ID, AGGREGATEFUNCTION(Name), MAX(Time) AS [Time]
FROM Your_Table
GROUP BY ID
这意味着,如果您的姓名不同,他们将不会创建单独的组


它也完全符合您的要求。

您的问题并不是说您希望根据
名称
获取输出,而是
ID
。因此,前面的答案在技术上是错误的。您应该使用:

SELECT ID, AGGREGATEFUNCTION(Name), MAX(Time) AS [Time]
FROM Your_Table
GROUP BY ID
这意味着,如果您的姓名不同,他们将不会创建单独的组


它也完全符合您的要求。

在说出
之前,请按id从tablename group中选择max(时间)、id、name,name
从tablename group中选择max(时间)、id、name,name
,因此前面的答案在技术上是错误的。
请检查您的答案。它甚至不起作用,最终导致语法错误:
列“Name”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。
请注意,我并不是说它不起作用,只是说您根据他没有要求的信息进行分组,这可能会导致错误的结果。我忽略了选择“名称”列,谢谢您的更正。其目的是完全满足OP要求。您的查询很好,我正在研究这种方法,因为它没有假设任何东西。然而,OP与他的问题相矛盾,只基于ID,并且在选择中需要姓名。通过您使用数据
111 BBB 2015-01-01
111 AAA 2015-05-01
的查询,他将获得
111 BBB 2015-05-01
。关键是OP想要实际的行或聚合名称否,我将聚合留给想象。我只看到文本数据的最小值/最大值,最终在某些情况下,在你说
之前,因此前面的答案在技术上是错误的。
检查你的答案。它甚至不起作用,最终导致语法错误:
列“Name”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。
请注意,我并不是说它不起作用,只是说您根据他没有要求的信息进行分组,这可能会导致错误的结果。我忽略了选择“名称”列,谢谢您的更正。其目的是完全满足OP要求。您的查询很好,我正在研究这种方法,因为它没有假设任何东西。然而,OP与他的问题相矛盾,只基于ID,并且在选择中需要姓名。通过您使用数据
111 BBB 2015-01-01
111 AAA 2015-05-01
的查询,他将获得
111 BBB 2015-05-01
。关键是OP想要实际的行或聚合的名称否,我将聚合留给想象。我最终只看到文本数据的最小值/最大值
row_NUMBER()
中的某些情况,因为rn将以相同的最大时间跳过数据,如:
111,'AAA','2015-11-05 15:39:24.000'
111,'DDD',“2015-11-05 15:39:24.000”
。换成RANK()怎么样
ROW_NUMBER()
as rn将以相同的最大时间跳过数据,如:
111、'AAA'、'2015-11-05 15:39:24.000'
111、'DDD'、'2015-11-05 15:39:24.000'
。换成RANK()怎么样?感谢您提供简单快捷的解决方案!感谢您提供简单快捷的解决方案!