a表
列1:车票名称ID
列2:车票名称
列3:制单人
列4:订单号
数据:
列1 列2 列3 列4
id1 name1 A No001
id1 name1 A No002
id1 name1 B No003
id1 name1 C No004
id2 name2 C No004
id1 name1 C No004
我想要知道 当前制单人订过的名称最多的车票 前5条; 前提不使用group by
------解决方案--------------------
不使用group by的理由是什么?
------解决方案--------------------
不做动态统计就需要维护一个统计表(制单人,名称,数量),实时更新。
------解决方案--------------------
不排除group by会影响性能,因为需要排序,但是不是说会影响性能就不能用,游标也影响性能啊,为什么到今时今日还不取消,因为它有自己的应用环境,不能一刀切
------解决方案--------------------
不知道意思是不是要使用窗口函数?
select distinct col1, COUNT(1)over(partition by col1) as count1,col3 from #temp where col3='C'
order by count1 desc
使用窗口函数的话,可以一次性查询出聚合值和非分组列,因为有些查询同时需要聚合结果和基础列信息
就比如是学生信息表中,同时需要学生的各科分数个班级平均分
第一次聚合出来(不同)班级和(不同)平均分字段,再连接一次表取得每个学生的单个成绩和班级平均分
利用窗口函数的话一次性就可以取出来这些结果集,减少表关联,
oracle中有优化过,三个不到十万条的表,可以从几秒钟减少到0.几秒
------解决方案--------------------
我是说实时更新,每次更改a表时都更新相应的统计记录。
所以没有 GROUP BY 的!