Присоединение к записи даты MAX в группе
Job
--------
Id
Description
JobStatus
----------
Id
JobId
StatusTypeId
Date
Как получить текущий JobStatus
для всех заданий?
так что-то вроде....
SELECT * FROM Job j
INNER JOIN ( /* Select rows with MAX(Date) grouped by JobId */ ) s
ON j.Id = s.JobId
(Я уверен, что есть несколько похожих вопросов, но я не мог найти ничего, что точно делает то, что мне нужно).
Ответы
Ответ 1
В SQL Server 2005+
:
SELECT *
FROM job j
OUTER APPLY
(
SELECT TOP 1 *
FROM jobstatus js
WHERE js.jobid = j.jobid
ORDER BY
js.date DESC
) js
В SQL Server 2000
:
SELECT *
FROM job j
LEFT JOIN
jobstatus js
ON js.id =
(
SELECT TOP 1 id
FROM jobstatus jsi
WHERE jsi.jobid = j.jobid
ORDER BY
jsi.date DESC
)
Эти запросы обрабатывают возможные дубликаты на Date
правильно.
Ответ 2
Один из способов:
SELECT j.*, s2.StatusTypeId, s2.Date
FROM Job j
JOIN
(
SELECT JobId, MAX(Date) AS LatestStatusDate
FROM JobStatus
GROUP BY JobId
) s1 ON j.JobId = s1.JobId
JOIN JobStatus s2 ON s1.JobId = s2.JobId AND s1.LatestStatusDate = s2.Date
Предполагая, что у вас не будет двух строк в JobStatus для той же комбинации JobId + Date
Ответ 3
Другое (не очень эффективное, но понятное) решение для SQL Server 2000: -
SELECT *
FROM job j
WHERE j.date = (SELECT MAX(date)
FROM job
WHERE id = j.id)