Tsql 根据多个表中的最大(日期)科目选择记录

Tsql 根据多个表中的最大(日期)科目选择记录,tsql,sql-server-2005,max,Tsql,Sql Server 2005,Max,我有两张表:一张用于初步评估,一张用于重新评估。格式如下: 初始评估: assessmentId personId 评估日期 totalScore 重新评估: assessmentId personId 评估日期 totalScore 每个表每人包含一条记录。重新评估表中可能不包含最近的评估。因此,我需要在两个表之间选择最新的评估以及给定人员的相应总分。我尝试了以下查询,但得到了多行: SELECT personId, MAX(assessmentDate) AS maxSubmitt

我有两张表:一张用于初步评估,一张用于重新评估。格式如下:

初始评估

  • assessmentId
  • personId
  • 评估日期
  • totalScore
重新评估

  • assessmentId
  • personId
  • 评估日期
  • totalScore
每个表每人包含一条记录。重新评估表中可能不包含最近的评估。因此,我需要在两个表之间选择最新的评估以及给定人员的相应总分。我尝试了以下查询,但得到了多行:

 SELECT personId, MAX(assessmentDate) AS maxSubmittedDt, TotalScore
 FROM (
    SELECT personId, assessmentDate, TotalScore
    FROM  initialAssessment
    WHERE personId = 1
    UNION
    SELECT personId, assessmentDate, TotalScore
    FROM Reassessments
    WHERE personId = 1) AS u
 Group BY personId, TotalScore
 Order By personId

我的问题是,如何在初始评估和重新评估表之间选择最近的评估及其相应的分数?如果重要的话,我使用的是SQl server 2005。

我注意到您的SQl没有应用从嵌套联合创建的别名“u”。此外,您的主要选择没有应用下面的组中正在应用的personId。请尝试以下操作:

SELECT u.personId AS offenderCD, MAX(u.assessmentDate) AS maxSubmittedDt, u.TotalScore
FROM (
SELECT personId, assessmentDate, TotalScore
FROM  initialAssessment
WHERE personId = 1

UNION

SELECT personId, assessmentDate, TotalScore
FROM Reassessments
WHERE personId = 1) AS u
Group BY u.personId, u.assessmentDate, u.TotalScore
Order By u.personId
会是这样的


如果您只想查询一个人,您可以使用TOP(n)+ORDER BY:

SELECT TOP (1) personId, assessmentDate, TotalScore
FROM (
    SELECT personId, assessmentDate, TotalScore
    FROM  initialAssessment
    WHERE personId = 1
    UNION
    SELECT personId, assessmentDate, TotalScore
    FROM Reassessments
    WHERE personId = 1) AS u
) s
ORDER BY assessmentDate DESC
;

但是,无论您希望在一个查询中得到多少人的结果,该选项都适用。

您不能先分组,然后在选择列表中的某些列上应用聚合函数
SELECT TOP (1) personId, assessmentDate, TotalScore
FROM (
    SELECT personId, assessmentDate, TotalScore
    FROM  initialAssessment
    WHERE personId = 1
    UNION
    SELECT personId, assessmentDate, TotalScore
    FROM Reassessments
    WHERE personId = 1) AS u
) s
ORDER BY assessmentDate DESC
;