2013-07-23 16 views
7

Al momento ho la seguente tabella:selezionare le righe distinte, mentre il raggruppamento in base al valore massimo

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 

cosa ho bisogno è la state per ogni distinta userid dall'ultimo eventtime simile al di sotto:

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 

Ho bisogno di qualcosa di simile al seguente, ma non riesco a ottenere ciò di cui ho bisogno.

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

possibile duplicato di [SQL Server selezionare righe distinte con valore più recente solo] (http://stackoverflow.com/questions/ 3442931/sql-server-select-distinct-rows-using-most-recent-value-only) – Bulat

risposta

7

Nel database che supportano funzioni analitiche, è possibile utilizzare 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

Anche se preferisco di gran lunga 'row_number()', questo potrebbe dare il meglio in alcune circostanze. –

+0

Anche questo è SQL standard :) Row_number() non è disponibile ovunque. – fancyPants

+2

. . 'row_number()' * è * ANSI standard SQL. Il problema è che nessun database reale implementa realmente lo standard. –

2

Lei non ha specificato cosa database in uso, ma si dovrebbe essere in grado di utilizzare una funzione di aggregazione in un sottoquery per ottenere il tempo massimo evento per ogni 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; 

Vedi SQL Fiddle with Demo

2

Si può provare questo: -

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

Questo non riguarda MAX (EventTime) per l'ID, è solo limitante ai tempi di eventi che sono MAX() per qualsiasi ID, fallirebbe se un evento non-max per un ID fosse il massimo per un altro ID. –

+0

@ Goat CO Hai perfettamente ragione. Ho capito quello che hai detto. L'ho aggiornato e funziona bene ora. :) –

+0

Sì, questo lo risolve, è una subquery correlata ora, quindi sta valutando il massimo per ogni ID. Potrebbe anche essere '=' invece di 'IN' perché la sottoquery restituisce un valore per ID. –

Problemi correlati