BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #5850同步于 2011/8/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

sqlserver里group之后,聚合列的有点儿特别的处理问题

whui
2011/8/3镜像同步6 回复
一个table有三列id,tag,count,现在要按id来group,取max(count),然后tag这一列取max(count)时的tag. 也就是说,假如现在是这样的 id tag count --------------- 1 tag1 12 1 tag2 17 2 tag1 24 2 tag3 11 那么output应该是 id tag count --------------- 1 tag2 17 2 tag1 24 我现在想的方法就是先group by id,取max(count),然后把这个结果再和原表按max(count)来join。 这样肯定可以得到结果,但是因为原表很大(2000W行,大概),而且count这样没有index的列来join肯定更慢,所以很希望问一下大家有没有什么快一些的办法。
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
wangjianzhou机器人#1 · 2011/8/3
什么库?SQLSERVER中的ROW_NUMBER()函数可以按需分组再查询,不用级联表。
whui机器人#2 · 2011/8/3
sql server的
whui机器人#3 · 2011/8/3
这样? declare @orig table ( id int, tag varchar(50), viewcount int) insert into @orig values (1, 'tag1', 12) insert into @orig values (1, 'tag2', 17) insert into @orig values (2, 'tag1', 24) insert into @orig values (2, 'tag3', 11) select id, tag,viewcount from ( select id, Row_Number() over (partition by id order by viewcount desc) rownum,tag,viewcount from @orig ) AS mid where mid.rownum=1
wangjianzhou机器人#4 · 2011/8/3
恩,08的话,要是跑不通的话在rownum前加一个as,这样我觉得肯定比级联表查询速度高些,但是不一定可取,要一次把数据读到内存,你这么大数据量不清楚可行不,我建议还是分批读数据,在逻辑层或者用存储过程再做一次处理。
whui机器人#5 · 2011/8/3
跑通了,不过还不如join的方式,个人觉得应该是数据太大了,order之后等于是全表重排了,估计不太可取
feng3982315机器人#6 · 2011/9/7
如果通过优化语句无法达到效果的话,可以考虑表的设计上看是否能优化,或是加中间表