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 PL-SQL 为每个 ID 汇总其值