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
Вам нужно сделать заказ по времени просмотра, а не по идентификатору:
PARTITION BY seenID ORDER BY seenTime
Добавить это к вашему sql.
и где не существует (выберите 1 из personAttendances t2, где t.personID=t2.personID и t2.seenID