Oracle 使用 MAX 获取最新记录

Posted

技术标签:

【中文标题】Oracle 使用 MAX 获取最新记录【英文标题】:Oracle Getting the Latest Record with MAX 【发布时间】:2015-11-13 18:16:29 【问题描述】:

我有 2 个表格来跟踪项目及其状态。

每个项目一次只能有 1 个活动状态,但该表还记录了这些项目的状态历史记录,以跟踪状态更改发生的时间。

查询

这是我现在的查询:

SELECT PROJ_NO, COMP_DATE, SPON_PROG, PROP_STATUS, AWD_S, AWD_E, AWD_AMT, DUEDT, MAX(STAT_DATE) AS STAT_DATE, ST_STATUS
FROM (
  SELECT DISTINCT prsl.PROJ_NO, NVL(TO_CHAR(prsl.DEADLINE, 'YYYY-Mon-DD'), TO_CHAR(prsl.SUBMIT_DATE, 'YYYY-Mon-DD')) AS COMP_DATE,
  prsl.SPON_PROG, prsl.PROP_STATUS, TO_CHAR(prsl.AWD_START, 'YYYY-Mon-DD') AS AWD_S, TO_CHAR(prsl.AWD_END, 'YYYY-Mon-DD') AS AWD_E, prsl.AWD_AMT,
  TO_CHAR(dlvr.DUEDATE, 'YYYY-Mon-DD') AS DUEDT,
  TO_CHAR(MAX(dlvr.ST_STAT_DATE), 'YYYY-Mon-DD') AS STAT_DATE,
  dlvr.ST_STATUS
  FROM adpcra.ra_v_q_ie_prsl03 prsl
  LEFT JOIN adpcra.ra_v_q_ie_pt_deliver dlvr ON prsl.PROJ_NO = dlvr.PROJ_NO
  WHERE prsl.EMPL_NO = '014209'
  AND prsl.FIRST_PD = 1
  AND (prsl.SPON_PROG LIKE 'UM-SSHRC RGP%'
      OR prsl.SPON_PROG LIKE 'UM-SSHRC TGP%'
      OR prsl.SPON_PROG LIKE 'URGP%'
      OR prsl.SPON_PROG LIKE 'UCRP%'
      OR prsl.SPON_PROG LIKE 'UIRP%'
      OR prsl.SPON_PROG LIKE 'Creative Works%'
  )
  GROUP BY prsl.PROJ_NO, NVL(TO_CHAR(prsl.DEADLINE, 'YYYY-Mon-DD'), TO_CHAR(prsl.SUBMIT_DATE, 'YYYY-Mon-DD')),
  prsl.SPON_PROG, prsl.PROP_STATUS, prsl.AWD_START, prsl.AWD_END, prsl.AWD_AMT, dlvr.DUEDATE, dlvr.ST_STATUS
)
GROUP BY PROJ_NO, COMP_DATE, SPON_PROG, PROP_STATUS, AWD_S, AWD_E, AWD_AMT, DUEDT, ST_STATUS
ORDER BY COMP_DATE DESC, STAT_DATE DESC

结果

这是该查询的简化结果(我删除了一些列以使其更简单):

proj_no    stat_date      st_status
=======================================
123        2015-Feb-25    Completed
123        2015-Jan-02    Not Completed
456        2013-Aug-07    Completed
456        2012-Aug-08    Not Completed
789        2011-Jun-16    Not Completed

结果表只是给了我不想包含的额外行。

基本上我只想得到这些:

proj_no    stat_date      st_status
=======================================
123        2015-Feb-25    Completed
456        2013-Aug-07    Completed
789        2011-Jun-16    Not Completed

我只想要每个项目的最新状态。

有人可以帮帮我吗?谢谢!

编辑

它以前不在子查询中,但我只是尝试了一些东西并最终得到了一个子查询。但无论哪种方式,结果都是一样的。

【问题讨论】:

我没有收到您的查询,但可能可以通过在 join 或 where 添加 and not exists(select proj_no from ... where proj_no = t.proj_no and start_date > t.start_date) 来解决。 【参考方案1】:

如果你已经有了这个

proj_no    stat_date      st_status
=======================================
123        2015-Feb-25    Completed
123        2015-Jan-02    Not Completed
456        2013-Aug-07    Completed
456        2012-Aug-08    Not Completed
789        2011-Jun-16    Not Completed

我们称之为YourQuery。只需使用row_number() 查找每个项目的最大日期。

SELECT proj_no,  stat_date,  st_status
FROM (
    SELECT 
          Y.*,
          row_number() over (partition by proj_no order by stat_date desc) as rn
    FROM YourQuery Y
    ) T
WHERE T.rn = 1       

【讨论】:

哦,嘿,这很好用。虽然我不明白。我对数据库不是很感兴趣。不过谢谢! 很高兴有帮助。这个想法是为每一行分配一个 ID,因为这些行是按日期 desc 排序的,最大值将始终是每个项目的 rn = 1。就像一群人一样。我将分享 sql server 帮助,因为它比我为 oracle 找到的更完整。 msdn.microsoft.com/es-es/library/ms186734(v=sql.120).aspx

以上是关于Oracle 使用 MAX 获取最新记录的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:查询各组最新的一条记录

取重复记录中时间最新的一条记录Oracle sql语句

获取几个月的最新记录并使用 Oracle PL-SQL 为每个 ID 汇总其值

具有最新记录的 Oracle 查询 GROUP BY [重复]

如何设置子查询以获取具有最新日期和最大 ID 的单个记录?

获取聚合中Max记录的ID