部落紀事: 一條關於求統計分組的最大值的sql

日期:2005-6-16

羣id:11233046 

問題描述:

在上面這個表中,我想要取出相同dept裏time1加起來最高的那條記錄
如果相同的dept中有兩條記錄相同則取兩個出來

id   dept   name  time1 
1      aa      x1      3      
2      aa      x1     4      
3      aa      x1     5 
4      bb     x2     4      
5      bb     x3     5 
6      aa     x4      7 
7      aa     x4      5

8      aa    x5     3
9      aa    x6     4
10    bb    x9    3
11    bb   x10  10

結果:

dept name sumMax

aa      x1      12

aa       x4     12

bb      x10   10

解答:

//--在access中測試通過
create table tbl
(
 id char(10),
 dept char(10),
 name char(10),
 time1 integer
)

insert into tbl(id,dept,name,time1)  values('1' ,'aa' ,'x1 ' ,3
 )
insert into tbl(id,dept,name,time1)  values('2' ,'aa' ,'x1 ' ,4 )
insert into tbl(id,dept,name,time1)  values('3' ,'aa' ,'x1 ' ,5)
insert into tbl(id,dept,name,time1)  values('4' ,'bb' ,'x2 ' ,4
 )
insert into tbl(id,dept,name,time1)  values('5' ,'bb' ,'x3 ' ,5)
insert into tbl(id,dept,name,time1)  values('6' ,'aa' ,'x4 ' ,7)
insert into tbl(id,dept,name,time1)  values('7' ,'aa' ,'x4' ,5
 )
insert into tbl(id,dept,name,time1)  values('8' ,'aa' ,'x5' ,3 )
insert into tbl(id,dept,name,time1)  values('9' ,'aa' ,'x6' ,4 )
insert into tbl(id,dept,name,time1)  values('10','bb' ,'x9' ,3 )
insert into tbl(id,dept,name,time1)  values('11','bb' ,'x10' ,10)

select dept,name, sum(time1) As sumMax  from tbl TmpA
group by dept,name
having (  sum(time1) >= all (select sum(time1) from tbl where TmpA.dept = dept group by name)  )

簡單評註:
在最初確定功能時候用的是一條比較冗臃拖沓的sql,其中充斥着幾個臨時表,之後發現其實只是求分組後的結果求最值而已。
於是着手修改。
在having 中進行 比較 是分組後的比較,這樣子能夠讓 比較的次數降低很多,尤其是 紀錄數很多 組數很少的情況
在分組的時候的效率已經由數據庫保證了。已經是不能更改的。
修改之後的sql果然讓人清爽。簡單,對稱,優美,高效。
實在忍不住將它記下來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章