如何在另一列之前找到具有最新日期的行?

我在 Oracle 中有一个查询,现在我一直在思考这个问题。它由相互连接的独立子查询组成,而 GROUP BY 把事情搞砸了。

SELECT TA.PROJECTID,TA.TASKID,TA.DUEDATE,MH.DATE_EXECUTION,MAX (TA.LAST_UPDATED_DATE) AS LAST_UPDATED_DATE
  FROM (TASKS TA
        INNER JOIN
        (SELECT PA.PROJECTID,MIN(PA.DATE_EXECUTION)
           FROM APPROVALS pa
         GROUP BY pa.PROJECTID) MH
           ON TA.PROJECTID = MH.PROJECTID)
 WHERE     
        TA.LAST_UPDATED_DATE <= MH.DATE_EXECUTION
 GROUP BY TA.PROJECTID,TA.DUEDATE

第一个内部联接右侧的第一个查询块(选择 pa.projectid...)返回一个表,其中包含项目 ID 和显示项目启动日期的 DATE_EXECUTION 列 - 每个项目一行。

我试图在该项目的 DATE_EXECUTION 之前使用最新的 LAST_UPDATED_DATE 为每个项目 ID 返回一行。 DUEDATE 的分组将事情搞砸并导致它返回多行。这里的想法是,TASKS 表中的每一行都是用户更新项目截止日期的不同时间,我试图确定项目开始执行时的当前截止日期(DATE_EXECUTION)。>

我觉得我快到了,只是不确定我的方法中缺少什么。

示例数据为:

项目ID 任务ID 到期 DATE_EXECUTION LAST_UPDATED_DATE
abc123 1 2022-01-07 2021-03-31 2021-03-03
abc123 1 2021-12-20 2021-03-31 2021-03-11
abc123 1 2021-12-27 2021-03-31 2020-11-18
abc123 1 2022-01-01 2021-03-31 2021-05-01

因此,在项目 abc123 和任务 ID 1 组合的上述数据中,我想要第二行:LAST_UPDATED_DATE 是 DATE_EXECUTION 之前的最新行。

iCMS 回答:如何在另一列之前找到具有最新日期的行?

谢谢大家,我想我自己解决了这个问题,使用 WITH 并选择 MAX(LAST_UPDATED_DATE) OVER (PARTITION BY PROJECTID,TASKID) AS LATEST_UPDATE

然后从仅由 WITH 定义的临时表中选择 LATEST_UPDATE = LAST_UPDATED_DATE 的行

WITH temptable 
AS (SELECT TA.PROJECTID,TA.TASKID,TA.DUEDATE,MH.DATE_EXECUTION,TA.LAST_UPDATED_DATE,MAX (TA.LAST_UPDATED_DATE) OVER (PARTITION BY TA.PROJECTID,TA.TASKID) AS LATEST_UPDATED
  FROM (TASKS TA
        INNER JOIN
        (SELECT PA.PROJECTID,MIN(PA.DATE_EXECUTION)
           FROM APPROVALS pa
         GROUP BY pa.PROJECTID) MH
           ON TA.PROJECTID = MH.PROJECTID)
 WHERE     
        TA.LAST_UPDATED_DATE <= MH.DATE_EXECUTION)

SELECT PROJECTID,TASKID,DUEDATE,DATE_EXECUTION,LAST_UPDATED_DATE
FROM temptable
WHERE LAST_UPDATED_DATE = LATEST_UPDATED
,

由于所有记录的due_date都不同,因此您可以从选择列表中删除due_date列,这将解决您的问题,或者您可以尝试以下方法-

SELECT TA1.PROJECTID,TA1.TASKID,TA2.DATE_EXECUTION,TA1.DUEDATE,TA1.LAST_UPDATED_DATE
  FROM TASKS TA1
 INNER JOIN (SELECT TA.PROJECTID,MAX(TA.LAST_UPDATED_DATE) AS LAST_UPDATED_DATE
               FROM TASKS TA
              INNER JOIN (SELECT PA.PROJECTID,MIN(PA.DATE_EXECUTION)
                            FROM APPROVALS pa
                           GROUP BY pa.PROJECTID) MH ON TA.PROJECTID = MH.PROJECTID)
              WHERE TA.LAST_UPDATED_DATE <= MH.DATE_EXECUTION
              GROUP BY TA.PROJECTID,MH.DATE_EXECUTION) TA2 ON TA1.PROJECTID = TA2.PROJECTID
                                             AND TA1.TASKID = TA2.TASKID
                                             AND TA1.DUEDATE = TA2.DUEDATE
                                             AND TA1.LAST_UPDATED_DATE = TA2.LAST_UPDATED_DATE;
,

我会像这样使用 correlated subquery

select  ta.projectid,ta.taskid,ta.duedate,mh.date_execution,ta.last_updated_date
from    tasks                                                 ta
   join ( select    projectid,min(date_execution) as date_execution
          from      approvals
          group by  projectid
        )                                                     mh
     on ta.projectid = mh.projectid
where   ta.last_updated_date =   (  select    max(x.last_updated_date) as last_updated_date
                                    from      tasks   x 
                                    where     x.projectid = ta.projectid 
                                          and x.last_updated_date <= mh.date_execution      );
,

DUEDATE 中删除 GROUP BY,然后使用 KEEP (DENSE_RANK LAST LAST_UPDATED_DATE) 对其进行聚合,首先过滤掉聚合中不是最新的 LAST_UPDATED_DATE 的所有行

SELECT TA.PROJECTID,MAX(TA.DUEDATE) KEEP (DENSE_RANK LAST ORDER BY TA.LAST_UPDATED_DATE)
         AS DUEDATE,MAX(TA.LAST_UPDATED_DATE) AS LAST_UPDATED_DATE
FROM   TASKS TA
       INNER JOIN (
         SELECT PA.PROJECTID,MIN(PA.DATE_EXECUTION)
         FROM   APPROVALS pa
         GROUP BY pa.PROJECTID
       ) MH
       ON TA.PROJECTID = MH.PROJECTID)
WHERE  TA.LAST_UPDATED_DATE <= MH.DATE_EXECUTION
GROUP BY
       TA.PROJECTID,MH.DATE_EXECUTION
本文链接:https://www.f2er.com/162751.html

大家都在问