mysql分組排序取最大、最小、最新、前N條記錄

先看一下本示例中需要使用到的數據

創建表並插入數據:

create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a',    2,   'a2')
insert into tb values('a',    1,   'a1')
insert into tb values('a',    3,   'a3')
insert into tb values('b',    1,   'b1')
insert into tb values('b',    3,   'b3')
insert into tb values('b',    2,   'b2')
insert into tb values('b',    4,   'b4')
insert into tb values('b',    5,   'b5')

數據表如下:

namevalmemo
a2a2
a1a1
a3a3
b1b1
b3b3
b2b2
b4b4
b5b5

 

按name分組取val最大的值所在行的數據

方法一:

select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name

方法二:

select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)

方法三:

select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name

方法四:

select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by

方法五:

select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name

以上五種方法運行的結果均爲如下所示:

namevalmemo
a3a3
b5b5

小編推薦使用第一、第三、第四鍾方法,結果顯示第1,3,4種方法效率相同,第2,5種方法效率差些。

按name分組取val最小的值所在行的數據

方法一:

select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name

方法二:

select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)

方法三:

select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name

方法四:

select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name

方法五:

select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name

以上五種方法運行的結果均爲如下所示:

namevalmemo
a1a1
b1b1

 

按name分組取第一次出現的行所在的數據 

sql如下:

select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name

結果如下:

namevalmemo
a2a2
b1b1

 

按name分組隨機取一條數據

sql如下:

select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name

結果如下:

namevalmemo
a1a1
b3b3

 

按name分組取最小的兩個(N個)val

第一種方法:

select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val

第二種方法:

select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val

第三種方法:

select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name

結果如下:

namevalmemo
a1a1
a2a2
b1b1
b2b2

 

按name分組取最大的兩個(N個)val

第一種方法:

select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val

第二種方法:

select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val

第三種方法:

select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name

結果如下:

namevalmemo
a3a3
a2a2
b5b5
b4b4

原文地址:http://www.manongjc.com/article/1082.html

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