首先讲一下场景,有一个父表订单表,子表货物表。
一个订单下会有多条货物信息。
我们要根据一个船名航次筛选出X个订单,假定为6个。
然后每个订单下又有三个货物,最终要拿到6个订单中最新的货物数据,也就是6条数据。
SQL语句如下
SELECT
* FROM
(
SELECT
G.字段1,G.字段2,G.字段3,
row_number() over( partition by I.订单名称 order by NVL(G.最后编辑时间,G.新增时间) DESC) RN
FROM 货物表 G
LEFT JOIN 订单表 I
ON 关联关系
WHERE 筛选条件 --比如i.isdel='0'
) R
WHERE R.RN=1
就是先把根据订单名称分组且按最后时间desc排序的数据加上序号,每个订单名称对应的排序号都是123,然后再在最外层筛选出排序号等于1的数据,就拿到最新的了。
row_number()就是加序号。
重点就是 over(partition by ) 后跟什么就根据什么字段分组,order by就是排序 正序asc 倒序desc 新手不要写错成dasc....
nvl的用法可能会有新手不懂,就是在前边值为空的时候取后边的值,非常适用于此类场景。