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