一尘不染

如何在SQL的另一列中检索与最大值对应的值?

sql

我有下表,它表示项目的评估。

ITEM             REFERENCEDATE     VALUATION
------------------------------------------------
A                25/01/2012        25.35
A                26/01/2012        51.35
B                25/01/2012        25.00

编辑:(ITEM,REFERENCEDATE)是唯一索引。

目的是获得一组物料的最新估值。这意味着我正在尝试创建一个将返回类似内容的SQL请求

ITEM             REFERENCEDATE     VALUATION
------------------------------------------------
A                26/01/2012        51.35
B                25/01/2012        25.00

在进行有关GROUP BY的教程时,我最终尝试了

SELECT A.ITEM, A.VALUATION, MAX(A.REFERENCEDATE)
FROM VALUATIONS A
GROUP BY A.ITEM

充满希望的是,SQL Server将理解我需要该行的A.VALUATION,以实现当前结果行上表示的ITEM的A.REFERENCEDATE的最大值。

但是,相反,我有此令人不愉快的错误消息:

Column 'VALUATIONS.VALUATION' is invalid in the select list because it is not contained 
in either an aggregate function or the GROUP BY clause.

如何指示应使用达到REFERENCEDATE最大值的VALUATION?

注意:我需要至少在Oracle和SQL Server上有效的解决方案

编辑: 谢谢大家的帮助。我被困在一个漏洞中,试图只使用一个SELECT … GROUP
BY请求。现在,我看到有两种方法可以围绕同一想法进行阐述:

  1. 用另一个独立请求的结果进行JOIN,它将返回所有item / max(date)对
  2. 使用子请求会在where子句中产生结果,其中每个子项的值都不同。

任何人都可以提供一个理由(或一个理由的指针)来优先于另一个吗?


阅读 249

收藏
2021-05-16

共1个答案

一尘不染

select a.item, a.valuation, a.referencedate
from valuations a
  join (select a2.item, max(referencedate) as max_date
        from valuations a2
        group by a2.item
  ) b ON a.item = b.item and a.referencedate = b.max_date
2021-05-16