Oracle SQL Developer - 添加多个子查询以查找最新日期值

问题描述 投票:0回答:1

我正在尝试从四个不同的表中选择数据:订单、约会、计划和记分卡。对于约会、计划和记分卡表,我正在尝试提取取货和交货日期。所有订单都有计划和记分卡日期,但并非所有订单都有预约日期。约会和计划表有一行用于取件,一行用于送货,记分卡表有一行。记分卡表只有一个取货日期和一个交货日期,每个订单永远不会改变,但对于约会和计划表,由于重新安排、订单更新等原因,可以为单个订单修改日期。每次约会或计划日期修改后,表中添加了一个新条目。我正在寻找最新修订的约会和计划日期为清楚起见进行了编辑 不一定是最大日期,因为有时约会和计划日期会重新安排到更早的日期。

此查询仅针对单个订单 id(最终我想为特定日期范围选择多个订单),并且它返回三行,因为约会有两个额外的修订。保留这样的查询将反映约会和计划日期的所有修订。我只想要最新约会和计划日期的一行。

select o.order_primary_reference, o.order_id,
    pu.appointment_date as latest_pickup_appt,
    dl.appointment_date as latest_del_appt,
    pu.plan_date as latest_pickup_plandate, dl.plan_date as latest_del_plandate,
    sc.scorecard_exp_pickup_date as scorecard_expected_pickup, sc.scorecard_exp_delivery_date as scorecard_expected_del
from orders o
left outer join appointment pu
on o.order_id = pu.appointment_order_id and pu.appointment_type = 'P'
left outer join appointment dl
on o.order_id = dl.appointment_order_id and dl.appointment_type = 'D'
join plan pu
on o.order_id = pu.plan_order_id and pu.stop_type = 'P'
join plan dl
on o.order_id = dl.plan_order_id and dl.stop_type = 'D'
join scorecard sc
on o.order_id = sc.scorecard_order_id
where o.order_id = 123456

此查询将在这种情况下获取我想要的日期(约会表中的最新取件约会),但是当我尝试将其合并到我的较大查询中时,通过几种不同的方式作为子查询,我遇到了错误。

select * from
(select pu.appointment_date,
row_number() over (partition by pu.appointment_order_id order by pu.appointment_date dsc) rn
from appointment pu
where pu.appointment_type = 'P' and pu.appointment_order_id = 123456)
where rn = 1
sql oracle subquery oracle-sqldeveloper row-number
1个回答
1
投票

像这样的一些样本数据:

WITH
    orders AS
        (
            Select 123 "ORDER_ID", 'ORDPRIMREF 123' "ORDER_PRIM_REF" From Dual Union All
            Select 456 "ORDER_ID", 'ORDPRIMREF 456' "ORDER_PRIM_REF" From Dual Union All
            Select 789 "ORDER_ID", 'ORDPRIMREF 789' "ORDER_PRIM_REF" From Dual 
        ),
    appoints AS
        (
            Select 123 "APP_ORDER_ID", To_Date('23.02.2023', 'dd.mm.yyyy') "APP_DATE", 'P' "APP_TYPE" From Dual Union All
            Select 123 "APP_ORDER_ID", To_Date('27.02.2023', 'dd.mm.yyyy') "APP_DATE", 'D' "APP_TYPE" From Dual Union All
            Select 456 "APP_ORDER_ID", To_Date('26.02.2023', 'dd.mm.yyyy') "APP_DATE", 'P' "APP_TYPE" From Dual Union All
            Select 456 "APP_ORDER_ID", To_Date('27.02.2023', 'dd.mm.yyyy') "APP_DATE", 'P' "APP_TYPE" From Dual Union All
            Select 456 "APP_ORDER_ID", To_Date('02.03.2023', 'dd.mm.yyyy') "APP_DATE", 'D' "APP_TYPE" From Dual Union All
            Select 456 "APP_ORDER_ID", To_Date('03.03.2023', 'dd.mm.yyyy') "APP_DATE", 'D' "APP_TYPE" From Dual Union All
            Select 789 "APP_ORDER_ID", Null "APP_DATE", 'P' "APP_TYPE" From Dual 
        ),
    plans AS
        (
            Select 123 "PL_ORDER_ID", To_Date('28.02.2023', 'dd.mm.yyyy') "PL_DATE", 'P' "PL_STP_TYPE" From Dual Union All
            Select 456 "PL_ORDER_ID", To_Date('17.02.2023', 'dd.mm.yyyy') "PL_DATE", 'D' "PL_STP_TYPE"  From Dual Union All
      Select 456 "PL_ORDER_ID", To_Date('20.02.2023', 'dd.mm.yyyy') "PL_DATE", 'D' "PL_STP_TYPE"  From Dual Union All
            Select 789 "PL_ORDER_ID", To_Date('03.03.2023', 'dd.mm.yyyy') "PL_DATE", 'P' "PL_STP_TYPE"  From Dual 
        ),
    scores AS
        (
            Select 123 "SC_ORDER_ID", To_Date('26.02.2023', 'dd.mm.yyyy') "SC_PICK_DATE", To_Date('01.03.2023', 'dd.mm.yyyy') "SC_DLVR_DATE" From Dual Union All
            Select 456 "SC_ORDER_ID", To_Date('27.02.2023', 'dd.mm.yyyy') "SC_PICK_DATE", To_Date('02.03.2023', 'dd.mm.yyyy') "SC_DLVR_DATE" From Dual Union All
            Select 789 "SC_ORDER_ID", To_Date('28.02.2023', 'dd.mm.yyyy') "SC_PICK_DATE", To_Date('03.03.2023', 'dd.mm.yyyy') "SC_DLVR_DATE" From Dual 
        )

...如果我做对了,您应该将 Inner Join 评分到订单和 Left Join 计划和任命,然后从最后两个中获取 MAX() 日期...
主 SQL

Select 
    o.ORDER_PRIM_REF, 
    o.ORDER_ID, 
    --
    MAX(app_p.APP_DATE) "APP_PICKUP_DATE", 
    MAX(app_d.APP_DATE) "APP_DELIVERY_DATE",
    --
    MAX(pl_p.PL_DATE) "PL_PICKUP_DATE", 
    MAX(pl_d.PL_DATE) "APP_DELIVERY_DATE",
    --
    sc.SC_PICK_DATE "SCORE_PICKUP_DATE", 
    sc.SC_DLVR_DATE "SCORE_DELIVERY_DATE"
From 
    orders o
Inner Join 
    scores sc ON(o.ORDER_ID = sc.SC_ORDER_ID)
Left join 
    appoints app_p ON(o.ORDER_ID = app_p.APP_ORDER_ID and app_p.APP_TYPE = 'P')
Left join 
    appoints app_d ON(o.ORDER_ID = app_d.APP_ORDER_ID and app_d.APP_TYPE = 'D')
Left Join 
    plans pl_p ON(o.ORDER_ID = pl_p.PL_ORDER_ID and pl_p.PL_STP_TYPE = 'P')
Left Join 
    plans pl_d ON(o.ORDER_ID = pl_d.PL_ORDER_ID and pl_d.PL_STP_TYPE = 'D')
Group By
    o.ORDER_PRIM_REF, o.ORDER_ID,
    sc.SC_PICK_DATE, sc.SC_DLVR_DATE

...样本日期如上 - 这将导致:

ORDER_PRIM_REF   ORDER_ID APP_PICKUP_DATE APP_DELIVERY_DATE PL_PICKUP_DATE APP_DELIVERY_DATE SCORE_PICKUP_DATE SCORE_DELIVERY_DATE
-------------- ---------- --------------- ----------------- -------------- ----------------- ----------------- -------------------
ORDPRIMREF 123        123 23-FEB-23       27-FEB-23         28-FEB-23                        26-FEB-23         01-MAR-23           
ORDPRIMREF 456        456 27-FEB-23       03-MAR-23                        20-FEB-23         27-FEB-23         02-MAR-23           
ORDPRIMREF 789        789                                   03-MAR-23                        28-FEB-23         03-MAR-23         
© www.soinside.com 2019 - 2024. All rights reserved.