【问题标题】:SQL select max(date) and corresponding value [duplicate]SQL选择最大值(日期)和相应的值[重复]
【发布时间】:2012-10-08 04:22:48
【问题描述】:

可能重复:
How to get the record of a table who contains the maximum value?

我有一个如下聚合查询:

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            

哪个有效,并且大部分时间都返回正确的数据,但我发现了一个问题。返回的 Notes 字段不一定与 max(completedDate) 来自的记录匹配。相反,它将是字符串最长的那个?还是 ASCII 值最高的那个?如果两条记录之间存在关联,SQL Server 会做什么?我什至不确定。我想要得到的是 max(completedDate) 记录中的 notes 字段。我该怎么做呢?

【问题讨论】:

  • CompletedDate 不是 DateTime 吗?
  • 这是一个日期时间。该字段没有问题,但 Notes 有问题。
  • max(completedDate) 的最大注释或每个注释?
  • 我使用 Max(notes) 来尝试获得我想要的东西,但我实际上并不想要最大的笔记。我真的想要与 max(dateCompleted) 在同一记录中的任何注释。

标签: sql sql-server sql-server-2000


【解决方案1】:

没有简单的方法可以做到这一点,但这样的事情会奏效:

SELECT ET.TrainingID, 
  ET.CompletedDate, 
  ET.Notes
FROM 
HR_EmployeeTrainings ET
inner join
(
  select TrainingID, Max(CompletedDate) as CompletedDate
  FROM HR_EmployeeTrainings
  WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID)
  GROUP BY AvantiRecID, TrainingID  
) ET2 
  on ET.TrainingID = ET2.TrainingID
  and ET.CompletedDate = ET2.CompletedDate

【讨论】:

  • 您的子查询语法错误,您缺少FROM 子句。
【解决方案2】:

您可以使用子查询。子查询将获得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

【讨论】:

    【解决方案3】:

    每个 MAX 函数都是单独评估的。因此 MAX(CompletedDate) 将返回最新的 CompletedDate 列的值,而 MAX(Notes) 将返回最大值(即按字母顺序排列的最高值)。

    您需要以不同的方式构建查询以获得您想要的结果。这个问题其实已经被问过好几次了,就不重复了:

    How to find the record in a table that contains the maximum value?

    Finding the record with maximum value in SQL

    【讨论】:

    • 如果这个问题之前已经回答了很多次,正确的做法是投票关闭为“完全重复”
    • 谢谢,我已经做到了。
    【解决方案4】:

    啊,是的,这就是 SQL 的意图。您分别获得每列的最大值。似乎您想从具有最大日期的行中返回值,因此您必须选择具有最大日期的行。我更喜欢使用子选择来执行此操作,因为查询保持紧凑易于阅读。

    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)
    

    如果您还想通过 AntiRecID 进行匹配,您也应该将其包含在子选择中。

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 2020-11-16
      • 2022-07-22
      • 2021-07-25
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2016-09-25
      相关资源
      最近更新 更多