加入到组中的MAX日期记录

fea*_*net 31 t-sql sql-server

Job
--------
Id
Description


JobStatus
----------
Id
JobId
StatusTypeId
Date
Run Code Online (Sandbox Code Playgroud)

我如何获得JobStatus所有工作的最新信息?

所以......

SELECT * FROM Job j
INNER JOIN ( /* Select rows with MAX(Date) grouped by JobId */ ) s
    ON j.Id = s.JobId
Run Code Online (Sandbox Code Playgroud)

(我确定已经有一堆类似的问题,但我找不到任何我需要的东西).

Qua*_*noi 54

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
Run Code Online (Sandbox Code Playgroud)

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
        )
Run Code Online (Sandbox Code Playgroud)

这些查询Date正确处理可能的重复项.

  • @Quassnoi,我指的是`OUTER APPLY` (2认同)
  • @openwonk:抱歉,是的,在SQL标准中称为`LATERAL`。PostgreSQL和Oracle都支持它。 (2认同)

Ada*_*Dev 7

一种方法是:

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
Run Code Online (Sandbox Code Playgroud)

假设您在JobStatus中没有2行用于相同的JobId + Date组合


小智 5

SQL Server 2000 的另一个(不是很有效,但易于理解)解决方案:--

SELECT  *
FROM    job j
WHERE   j.date = (SELECT MAX(date) 
                  FROM   job 
                  WHERE  id = j.id)
Run Code Online (Sandbox Code Playgroud)