【SQL篇】如何在流水表中查到最新的一条记录

最新在做SAP自动化采购项目,就是我发报文给SAP系统,然后SAP系统返回正确调用还是错误调用的信息会记录到OEM_VS_BU_PO_LOG流水表中现在有一个字段return_message记录了每次SAP返回的结果,
其中的返回报文如图所示:

[
    {
        "ZGUID": "FA2700002F691FD092ED0E3A2363BFAE",
        "EBELN": "4500004557",
        "TYPE": "S",
        "MESSAGE": "采购订单创建成功"
    }
]

现在一个po_id对应多笔返回的报文,我要取最新的一笔
现在一个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.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值