2013-07-23 61 views
7

目前,我有如下表:同時通過最大值分組選擇不同的行

ID | Name | EventTime   | State 
1001 | User 1 | 2013/07/22 00:00:05 | 15 
1002 | User 2 | 2013/07/23 00:10:00 | 100 
1003 | User 3 | 2013/07/23 06:15:31 | 35 
1001 | User 1 | 2013/07/23 07:13:00 | 21 
1001 | User 1 | 2013/07/23 08:15:00 | 25 
1003 | User 3 | 2013/07/23 10:00:00 | 22 
1002 | User 2 | 2013/07/23 09:18:21 | 50 

我需要的是state爲每個不同的userid從最後eventtime以下類似:

ID | Name | EventTime   | State 
1001 | User 1 | 2013/07/23 08:15:00 | 25 
1003 | User 3 | 2013/07/23 10:00:00 | 22 
1002 | User 2 | 2013/07/23 09:18:21 | 50 

我需要類似以下的東西,但我不能完全得到我需要的東西。

SELECT ID, Name, max(EventTime), State 
FROM MyTable 
GROUP BY ID 
+0

可能重複[SQL服務器採用最新的值選擇不同的行只(http://stackoverflow.com/questions/ 3442931/sql-server-select-distinct-rows-using-most-recent-value-only) – Bulat

回答

7

在支持分析功能的數據庫,你可以使用row_number()

select * 
from (
     select row_number() over (partition by ID 
            order by EventTime desc) as rn 
     ,  * 
     from YourTable 
     ) as SubQueryAlias 
where rn = 1 
11
SELECT 
ID, Name, EventTime, State 
FROM 
MyTable mt 
WHERE EventTime = (SELECT MAX(EventTime) FROM MyTable sq WHERE mt.ID = sq.ID) 
+1

雖然我更喜歡'row_number()',這可能會在某些情況下表現最好。 –

+0

這也是標準的SQL :) Row_number()在任何地方都不可用。 – fancyPants

+2

。 。 'row_number()'*是* ANSI標準SQL。問題是,沒有真正的數據庫真正實現該標準。 –

2

您沒有指定您所使用的數據庫,但你應該能夠在使用聚合函數子查詢,以獲得最大的事件時間,每個ID:

select t1.id, 
    t1.name, 
    t1.eventtime, 
    t1.state 
from mytable t1 
inner join 
(
    select max(eventtime) eventtime, id 
    from mytable 
    group by id 
) t2 
    on t1.id = t2.id 
    and t1.eventtime = t2.eventtime 
order by t1.id; 

SQL Fiddle with Demo

2

你可以試試這個: -

SELECT ID, Name, EventTime, State 
FROM mytable mm Where EventTime IN (Select MAX(EventTime) from mytable mt where mt.id=mm.id) 

SQL FIDDLE

+0

這並不涉及MAX(EventTime)與ID,它僅限於任何ID的MAX()的事件時間,如果一個ID的非最大事件時間碰巧是另一個ID的最大事件時間,則會失敗ID。 –

+0

@Goat CO你是絕對正確的兄弟。我得到了你所說的。我已經更新了它,現在工作正常。 :) –

+0

是的,修復它,它現在是一個相關的子查詢,所以它正在評估每個ID的最大值。它可以很容易地用'='而不是'IN',因爲子查詢爲每個ID返回一個值。 –

相關問題