SQL: вернуть только первое вхождение

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

Записи:

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

Требуемый результат:

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

PS: обратите внимание на SQL CE 4

4 ответа

Решение

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

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

Обновление для другого случая:

Если это не так, и вы действительно хотите, чтобы 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

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

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

Для PostgreSQL есть DISTINCT ON

Вам нужно сделать заказ по времени просмотра, а не по идентификатору:

PARTITION BY seenID ORDER BY seenTime

Добавить это к вашему sql.

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

Другие вопросы по тегам