最近需要写个存储过程对一些数据进行处理,需求类似于这样的:
有一个张表(order)记录的是用户购买商品的数据,字段为用户id,用户购买商品的名称,购买时间,这样的话里面的用户id和商品名称肯定就会有重复数据,那么对重复的数据只需要取其第一条记录即可。
那么这时候就可以对其使用下面的函数对数据进行分组排序
ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)
上面的函数表示根据COL1字段对数据进行分组,在分组内部再根据 COL2字段进行排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。
其中,partition by 是指定按哪些字段进行分组,这些字段值相同的记录将在一起编号;order by则是指定在同一组中进行编号时是按照怎样的顺序。
比如:
select a.*
from (
select *, row_number() over (partition by [商品名称] order by [购买时间]) as partion_idx
from order_talbe
) a
where a.partion_idx = 1
上面的sql的意思就是查出order表里的所有数据,(然后对数据根据商品名称进行分类,并且组内根据购买时间进行排序)这个结果作为一个分类后排序的字段,然后再从上面的结果集中取数据,并且是分组组内为第一个的数据。
所以这里主要是使用了一个
ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)
对数据进行分组和组内的排序。希望