最新在做SAP自动化采购项目,就是我发报文给SAP系统,然后SAP系统返回正确调用还是错误调用的信息会记录到OEM_VS_BU_PO_LOG流水表中现在有一个字段return_message记录了每次SAP返回的结果,
其中的返回报文如图所示:
[
{
"ZGUID": "FA2700002F691FD092ED0E3A2363BFAE",
"EBELN": "4500004557",
"TYPE": "S",
"MESSAGE": "采购订单创建成功"
}
]
现在一个po_id对应多笔返回的报文,我要取最新的一笔

废话不多说直接上SQL
select
OVBP.VIN,
OVBP.sap_task_id,
OVBP.material_code,
OVBP.material_name,
OVBP.spl_code,
OVBP.pch_code,
OVBP.sap_pch_no,
OVBP.sap_in_no,
OVBP.pur_status,
OVBP.sap_po_status,
OVBP.oem_company_id,
OVBPL.RETURN_MESSAGE,
OVBPL.PO_LOG_ID,
OVBP.PO_ID,
OVBPL.IMPORT_TEXT,
OVBPL.EXECUTE_TYPE,
OVBPL.EXECUTE_TIME,
OVBP.CREATE_DATE
from
OEM_VS_BU_PO OVBP
left join oem_vs_bu_po_log OVBPL on
OVBPL.po_id = OVBP.PO_ID
where
1 = 1
and OVBP.oem_company_id = 10000002
and OVBPL.PO_LOG_ID in (
select
MAX(PO_LOG_ID) PO_LOG_ID
from
oem_vs_bu_po_log
where
PO_ID = OVBP.PO_ID
group by
PO_ID)
group by
OVBP.PO_ID
第二种写法
SELECT
OVBP.PO_ID,
OVBP.VIN,
OVBP.sap_task_id,
OVBP.material_code,
OVBP.material_name,
OVBP.spl_code,
OVBP.pch_code,
OVBP.sap_pch_no,
OVBP.sap_in_no,
OVBP.pur_status,
OVBP.sap_po_status,
OVBP.oem_company_id,
OVBPL.RETURN_MESSAGE,
OVBPL.PO_LOG_ID,
OVBP.PO_ID,
OVBPL.IMPORT_TEXT,
OVBPL.EXECUTE_TYPE,
OVBPL.EXECUTE_TIME,
OVBP.CREATE_DATE,
-- 本来这边是return_message是拼接所有的,现在要最新的一条所以这里不需要了
-- GROUP_CONCAT(DISTINCT OVBPL.RETURN_MESSAGE SEPARATOR ';') AS INTER_MESSAGE
FROM
OEM_VS_BU_PO OVBP
left join (SELECT PO_ID, MAX(PO_LOG_ID) PO_LOG_ID ,return_message
FROM oem_vs_bu_po_log
GROUP BY PO_ID) v on v.PO_ID = OVBP.PO_ID
LEFT JOIN oem_vs_bu_po_log OVBPL ON OVBPL.PO_LOG_ID = v.PO_LOG_ID
WHERE 1=1
AND OVBP.oem_company_id =10000002
GROUP BY OVBP.PO_ID
另外展望:
我使用的mysql5.7 如果是mysql8以上版本可以使用row_number函数来
partition by po_id 再order by po_log_id来选出最新的那一笔返回报文
SQL如下
SELECT
OVBP.PO_ID,
OVBP.VIN,
t1.return_message,
OVBP.sap_task_id,
OVBP.material_code,
OVBP.material_name,
OVBP.spl_code,
OVBP.pch_code,
OVBP.sap_pch_no,
OVBP.sap_in_no,
OVBP.pur_status,
OVBP.sap_po_status,
OVBP.oem_company_id
FROM
OEM_VS_BU_PO OVBP LEFT JOIN
(SELECT
sub_log.po_id,
sub_log.po_log_id,
sub_log.return_message,
min(count_num)
from
(SELECT
po_id,return_message,po_log_id,
ROW_NUMBER() OVER (PARTITION BY po_id ORDER BY po_log_id DESC) as count_num
from oem_vs_bu_po_log
) as sub_log
GROUP BY po_id) AS t1
on OVBP.PO_ID = t1.PO_ID
6万+

被折叠的 条评论
为什么被折叠?



