【问题标题】:Joining to MAX date record in group加入组中的 MAX 日期记录
【发布时间】:2011-06-18 15:02:28
【问题描述】:
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

(我确信已经有很多类似的问题,但我找不到任何符合我需要的东西)。

【问题讨论】:

标签: sql-server tsql


【解决方案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 上可能的重复项。

【讨论】:

  • 自 2005 年以来我怎么就错过了这个!谢谢你的回答:)
  • 让我大吃一惊...这是标准 SQL 还是特定于 SQL Server?
  • @openwonk: TOP 特定于 SQL Server,大多数其他 SQL 方言使用 LIMIT
  • @Quassnoi,我指的是OUTER APPLY
  • @openwonk:哦,对不起,是的,这在 SQL 标准中称为LATERAL。 PostgreSQL 和 Oracle 确实支持它。
【解决方案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 中不会有 2 行相同的 JobId + Date 组合

【讨论】:

  • 我知道我不应该感谢你。但这真的很棒。本质上,这里发生的事情是您相信与该工作相关的最高日期将与第二个更重要的加入相匹配。
【解决方案3】:

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

SELECT  *
FROM    job j
WHERE   j.date = (SELECT MAX(date) 
                  FROM   job 
                  WHERE  id = j.id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 2014-10-19
    • 1970-01-01
    • 2017-07-04
    • 2012-05-18
    • 2021-05-08
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多