如何根据聚合函数返回其他字段?

时间:2010-07-02 21:05:11

标签: sql-server-2005 function aggregate greatest-n-per-group

我有两张桌子,

jobcli

  • client_id
  • JOB_ID

作业

  • JOB_ID
  • JOBTITLE
  • 的startDate
  • projectmgr

我遇到的问题是在查询中显示client_id,job_id,jobTitle,startDate和projectmgr,其中结果按client_id分组并且具有最大日期。

到目前为止,我可以获得一个由client_id分组的列表及其对应的max(startDate)。

SELECT client_id,MAX(startDate)AS LastJob 在jobcli.job_id = dbo.jobs.id上的jobcli INNER JOIN工作 GROUP BY jobcli.client_id

此查询仅返回2个字段,client_id和LastJob,但我还想显示上一个作业的job_id,projectmrg和title。

此方案适用于SQL Server 2005。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

这是Stack Overflow上出现了数十次最大的每组问题。

以下是几个解决方案:

SELECT j1.*
FROM jobcli j1
WHERE NOT EXISTS (
    SELECT * FROM jobcli j2 
    WHERE j1.client_id = j2.client_id 
      AND j1.startDate < j2.startDate
);

或者,由于您使用的是Microsoft SQL Server 2005,因此可以使用窗口函数:

WITH rownumbered_jobcli AS (
  SELECT j.*, ROW_NUMBER() OVER (PARTITION BY j.client_id 
                                 ORDER BY j.startDate DESC) AS RN
  FROM jobcli;
)
SELECT * FROM rownumbered_jobcli WHERE RN = 1;