2015-11-04 65 views
1

我有一個類似的表:查詢最大時間(最新)按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

回答

4

如果你想保持你可以使用一個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

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 /名稱對。不同的數據,你會得到:

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

2

使用MAX函數查找最新時間。

查詢

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

感謝您提供簡單快捷的解決方案! – DDan

1

你的問題並沒有說你想得到你的輸出基於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