Присоединение к МАКСИМАЛЬНОЙ дате записи в группе - PullRequest
27 голосов
/ 31 января 2011
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

(я уверен, что есть кучаподобных вопросов уже нет, но я не смог найти ничего, что именно делает то, что мне нужно).

Ответы [ 3 ]

46 голосов
/ 31 января 2011

В 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.

7 голосов
/ 31 января 2011

Один из способов заключается в следующем:

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

При условии, что у вас не будет 2 строк в JobStatus для одной и той же комбинации JobId + Date

3 голосов
/ 06 мая 2016

Другое (не очень эффективное, но простое для понимания) решение для SQL Server 2000: -

SELECT  *
FROM    job j
WHERE   j.date = (SELECT MAX(date) 
                  FROM   job 
                  WHERE  id = j.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...