当前位置: 代码迷 >> Sql Server >> 不使用group by查询条数解决方案
  详细解决方案

不使用group by查询条数解决方案

热度:88   发布时间:2016-04-24 10:03:22.0
不使用group by查询条数
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.几秒
------解决方案--------------------
引用:
Quote: 引用:

不做动态统计就需要维护一个统计表(制单人,名称,数量),实时更新。
  是的 这个表就是用来统计数据的,然后就讨论起来了group by影响性能的问题;

我是说实时更新,每次更改a表时都更新相应的统计记录。
所以没有 GROUP BY 的!
  相关解决方案