MAW*_*656 16 sql sql-server sql-server-2000
可能重复:
如何获取包含最大值的表的记录?
我有一个如下所示的聚合查询:
SELECT TrainingID, Max(CompletedDate) as CompletedDate, Max(Notes) as Notes --This will only return the longest notes entry
FROM HR_EmployeeTrainings ET
WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID)
GROUP BY AvantiRecID, TrainingID
Run Code Online (Sandbox Code Playgroud)
哪个有效,并且大部分时间都返回正确的数据,但我注意到了一个问题.返回的Notes字段不一定与max(completedDate)来自的记录匹配.相反,它将是最长的字符串?或者具有最高ASCII值的那个?如果两个记录之间存在关联,SQL Server会做什么?我甚至都不确定.我想得到的是max(completedDate)记录中的notes字段.我应该怎么做呢?
Tar*_*ryn 23
您可以使用子查询.子查询将获得Max(CompletedDate)
.然后,您可以获取此值并再次加入您的表格以检索与该日期关联的备注:
select ET1.TrainingID,
ET1.CompletedDate,
ET1.Notes
from HR_EmployeeTrainings ET1
inner join
(
select Max(CompletedDate) CompletedDate, TrainingID
from HR_EmployeeTrainings
--where AvantiRecID IS NULL OR AvantiRecID = @avantiRecID
group by TrainingID
) ET2
on ET1.TrainingID = ET2.TrainingID
and ET1.CompletedDate = ET2.CompletedDate
where ET1.AvantiRecID IS NULL OR ET1.AvantiRecID = @avantiRecID
Run Code Online (Sandbox Code Playgroud)
是啊,这就是它在SQL中的意图.你可以单独获得每列的最大值.您似乎希望从具有最大日期的行返回值,因此您必须选择具有最大日期的行.我更喜欢使用subselect来执行此操作,因为查询保持紧凑易读.
SELECT TrainingID, CompletedDate, Notes
FROM HR_EmployeeTrainings ET
WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID)
AND CompletedDate in
(Select Max(CompletedDate) from HR_EmployeeTrainings B
where B.TrainingID = ET.TrainingID)
Run Code Online (Sandbox Code Playgroud)
如果您还想通过AntiRecID进行匹配,那么您也应该在subselect中包含它.
归档时间: |
|
查看次数: |
149054 次 |
最近记录: |