通过id SQL Server查询最长时间(最新)

时间:2015-11-04 12:07:24

标签: 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.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

4 个答案:

答案 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_RANKRanking 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

这意味着如果您的名字不同,则他们不会创建单独的组。

它也完全符合您的要求。