2012-01-04 1 views
5

Я редко используют SQL, и я не могу найти ничего подобного в моем архиве, так что я задаю этот простой вопрос запрос: Мне нужен запрос, который один возвращает PersonId и только первый seenTimeSQL: Возврат только первое вхождение

записей:

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 

Wanted результат:

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

Вот что я сделал & не удалось:

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: Уведомление SQL CE 4

ответ

10

Если seenTime увеличивается по мере увеличения seenID:

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

Update Fo г другой случай:

Если это не так, и вы действительно хотите seenTime, который соответствует минимальному seenID (при условии, seenID уникален):

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

Спасибо! Это просто, как я ожидал ... Я использовал MAX много раз, но MIN ... –

-1

добавить к вашей SQL.

и где не существует (выберите 1 из personAttendances t2 где t.personID = t2.personID и t2.seenID < t.seenID)

0

Вам нужно заказать увиденным время не видели ID:

PARTITION BY seenID ORDER BY seenTime 
6

Вы делаете это путь слишком сложно:

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

Из-за 6 вечера. Благодаря! –