2012-01-04 9 views
5

que rara vez uso de SQL y no puedo encontrar nada similar en mi archivo, así que estoy haciendo esta pregunta simple consulta: Necesito una consulta que se vuelve PERSONID y sólo la primera seenTimeSQL: devolver sólo la primera aparición

Records:

seenID | personID | seenTime 
    108  3   13:34 
    109  2   13:56 
    110  3   14:22 
    111  3   14:31 
    112  4   15:04 
    113  2   15:52 

resultado deseado:

personID | seenTime 
    3   13:34 
    2   13:56 
    4   15:04 

Eso es lo que hice & fallidos:

SELECT t.attendanceID, t.seenPersonID, t.seenTime 
(SELECT ROW_NUMBER() OVER (PARTITION BY seenID ORDER BY seenID) AS RowNo, 
seenID, 
seenPersonID, 
seenTime 
FROM personAttendances) t 
WHERE t.RowNo=1 

P.S: Aviso SQL CE 4

Respuesta

10

Si sus seenTime aumenta a medida que aumenta seenID:

select personID, min(seenTime) as seenTime 
from personAttendances 
group by personID 

actualización fo r otro caso:

Si este no es el caso, y que realmente quiere el seenTime que se corresponde con la seenID mínimo (asumiendo seenID es única):

select a.personID, a.seenTime 
from personAttendances as a 
    join (
     -- Get the min seenID for each personID 
     select personID, min(seenID) as seenID 
     from personAttendances 
     group by personID 
    ) as b on a.personID = b.personID 
where a.seenID = b.seenID 
+0

¡Gracias! Es simple como esperaba ... He usado MAX muchas veces, pero MIN ... –

-1

añadir esto a su SQL.

y donde no existe (seleccione 1 de personAttendances t2 donde t.personID = t2.personID y t2.seenID < t.seenID)

0

Tienes que pedir por el tiempo no visto por visto id:

PARTITION BY seenID ORDER BY seenTime 
6

Lo estás haciendo manera demasiado difícil:

select personID, min(seenTime) 
from personAttendances 
group by personID 
+0

A causa de las 6 p.m. ¡Gracias! –

Cuestiones relacionadas