oracle中实现对某一列分组,并显示多列的写法

发布时间:

之前一直用的mysql,在处理分组问题,就非常的方便,直接使用group by就搞定了,但用oracle,直接使用group by只能实现显示的所有列都参与的分组,并且显示的列必须和group by后边的列对应,否则sql报错,如下图。

oracle中实现对某一列分组,并显示多列的写法

2.分析: 通过网上查找资料,发现mysql,oracle数据库的分组函数group by是不一样的,这个坑很大,被坑惨了,在mysql中,只需要将要分组的列写到group by后边,就可以查询分好组后的全部列的数据,oracle中使用group by只能是显示列和分组列对应,各自实现代码如下:

//mysql直接这样写
select *from student group by name 
//mysql直接这样写都可以
select name age student group by name
//oracle只能这样写
select name from student group by name
//oracle 试图这样写,也直接报错
select name,age from student group by name
//上边的这个语句想不报错,只能这样写
select name,age from student group by name,age

3.oracle中实现对某一列分组,并显示多列写法 我们在oracle中使用group by实现对某一列分组,并显示多列的写法,我目前还没找到,感觉用这个函数实现不了,我是使用row_number() over(partition by 字段 order by 字段)函数实现的,大概思路是:先将查询出来的集合进行partition 分组(根据partition 后的字段来分组),然后需要排序的再order by 字段排序;这样这个函数会产生一个虚拟字段,这个字段是对分组后的数据进行排序编号 具体sql如下:

//我这行代码大概意思是:将查询的结果集先分组,再排序标记排序编号,然后获取排序为1的数据,实现的需求是:获取最新时间的不重复的数据
select id,pid,SHAPE from(
select b.id,b.pid,a.SHAPE,row_number() over(partition by b.pid order by b.p_time desc) rn fromSP_PRODUCER_WELL a,SP_WELL_DAILY_STATS b where a.id=b.pid and a.DEL_FLAG=0 and b.DEL_FLAG=0
 order by b.P_TIME desc) bb
where rn=1

4.补充: row_number() over(partition by 字段 order by 字段)函数中的参数partition by不是必填的,如果只涉及到显示一列表字段,那么也可以用group by来替代。 对于oracle中使用group by实现对某一列分组,并显示多列的写法,我继续找资料,如果找到了,会补充