1. 程式人生 > >mysql分組後取每組指定記錄數的方法

mysql分組後取每組指定記錄數的方法

--按某一欄位分組 取最大(小)值所在行的資料

/*

資料如下:

name val memo

a    2   a2(a的第二個值)

a    1   a1--a的第一個值

a    3   a3:a的第三個值

b    1   b1--b的第一個值

b    3   b3:b的第三個值

b    2   b2b2b2b2

b    4   b4b4

b    5   b5b5b5b5b5

*/

--建立表並插入資料:

create table tb(name varchar(10),val int,memo varchar(20))

insert into tb values('a',    2,   'a2(a的第二個值)')

insert into tb values('a',    1,   'a1--a的第一個值')

insert into tb values('a',    3,   'a3:a的第三個值')

insert into tb values('b',    1,   'b1--b的第一個值')

insert into tb values('b',    3,   'b3:b的第三個值')

insert into tb values('b',    2,   'b2b2b2b2')

insert into tb values('b',    4,   'b4b4')

insert into tb values('b',    5,   'b5b5b5b5b5')

go

--一、按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

/*

name       val         memo                

---------- ----------- --------------------

a          2           a2(a的第二個值)

a          3           a3:a的第三個值

b          4           b4b4

b          5           b5b5b5b5b5

*/

--二、按name分組 取val最小的值所在行的資料。

--方法1:

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

--方法2:

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

--方法3:

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

--方法4:

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

--方法5

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

/*

name       val         memo                

---------- ----------- --------------------

a          1           a1--a的第一個值

b          1           b1--b的第一個值

*/

--三、按name分組 取第一次出現的行所在的資料。

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

/*

name       val         memo                

---------- ----------- --------------------

a          2           a2(a的第二個值)

b          1           b1--b的第一個值

*/

--四、按name分組 隨機取一條資料。

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

/*

name       val         memo                

---------- ----------- --------------------

a          1           a1--a的第一個值

b          5           b5b5b5b5b5

*/

--五、按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

/*

name       val         memo                

---------- ----------- --------------------

a          1           a1--a的第一個值

a          2           a2(a的第二個值)

b          1           b1--b的第一個值

b          2           b2b2b2b2

*/

--六、按name分組 取val最大的值所在行的資料。

--方法1:

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

--方法2:

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

--方法3:

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

--方法4:

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 a.name

--方法5

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

/*

name       val         memo                

---------- ----------- --------------------

a          3           a3:a的第三個值

b          5           b5b5b5b5b5

*/

--七,假如整行資料有重複,所有的列都相同。

/*

資料如下:

name val memo

a    2   a2(a的第二個值)

a    1   a1--a的第一個值

a    1   a1--a的第一個值

a    3   a3:a的第三個值

a    3   a3:a的第三個值

b    1   b1--b的第一個值

b    3   b3:b的第三個值

b    2   b2b2b2b2

b    4   b4b4

b    5   b5b5b5b5b5

*/

--在sql server 2000中只能用一個臨時表來解決,生成一個自增列,先對val取最大或最小,然後再通過自增列來取資料。

--建立表並插入資料:

create table tb(name varchar(10),val int,memo varchar(20))

insert into tb values('a',    2,   'a2(a的第二個值)')

insert into tb values('a',    1,   'a1--a的第一個值')

insert into tb values('a',    1,   'a1--a的第一個值')

insert into tb values('a',    3,   'a3:a的第三個值')

insert into tb values('a',    3,   'a3:a的第三個值')

insert into tb values('b',    1,   'b1--b的第一個值')

insert into tb values('b',    3,   'b3:b的第三個值')

insert into tb values('b',    2,   'b2b2b2b2')

insert into tb values('b',    4,   'b4b4')

insert into tb values('b',    5,   'b5b5b5b5b5')

go

select * , px = identity(int,1,1) into tmp from tb

select m.name,m.val,m.memo from

(

select t.* from tmp t where val = (select min(val) from tmp where name = t.name)

) m where px = (select min(px) from

(

select t.* from tmp t where val = (select min(val) from tmp where name = t.name)

) n where n.name = m.name)

drop table tb,tmp

/*

name       val         memo

---------- ----------- --------------------

a          1           a1--a的第一個值

b          1           b1--b的第一個值

(2 行受影響)

*/

--在sql server 2005中可以使用row_number函式,不需要使用臨時表。

--建立表並插入資料:

create table tb(name varchar(10),val int,memo varchar(20))

insert into tb values('a',    2,   'a2(a的第二個值)')

insert into tb values('a',    1,   'a1--a的第一個值')

insert into tb values('a',    1,   'a1--a的第一個值')

insert into tb values('a',    3,   'a3:a的第三個值')

insert into tb values('a',    3,   'a3:a的第三個值')

insert into tb values('b',    1,   'b1--b的第一個值')

insert into tb values('b',    3,   'b3:b的第三個值')

insert into tb values('b',    2,   'b2b2b2b2')

insert into tb values('b',    4,   'b4b4')

insert into tb values('b',    5,   'b5b5b5b5b5')

go

select m.name,m.val,m.memo from

(

select * , px = row_number() over(order by name , val) from tb

) m where px = (select min(px) from

(

select * , px = row_number() over(order by name , val) from tb

) n where n.name = m.name)

drop table tb

/*

name       val         memo

---------- ----------- --------------------

a          1           a1--a的第一個值

b          1           b1--b的第一個值

(2 行受影響)

*/

相關推薦

mysql分組指定記錄方法

--按某一欄位分組 取最大(小)值所在行的資料 /* 資料如下: name val memo a    2   a2(a的第二個值) a    1   a1--a的第一個值 a    3   a3:a的第三個值 b    1   b1--b的第一個值 b    3   b3

sqlite 分組獲取的第一條記錄

有表如下 CREATE TABLE test ( id INTEGER PRIMARY KEY ,groupid INTEGER DEFAULT 0 ,t INTEGER DEFAULT 0 ,x INTEGER DEFAULT 0 ,y INTEGER DEFAULT 0

用postgresql特性簡化group by 前n條記錄方法

需求: 求一段時間內各生產線前3名壞機的原因及壞機數. step 1, 從將原始資料中抽取品質資料放於t96臨時表 create temp table t96 on commit drop as

分組查詢前n條記錄例項

假設有這樣一張運動員比賽成績表 tb_score 現在要求查詢出每個國家的前三名的成績記錄,查詢語句可以這樣寫: 1、 select t3.id,t3.country,t3.score fro

group by分組獲得中時間最大的那條記錄

用途: GROUP BY 語句用於 對一個或多個列對結果集進行分組。 例子: 原表: 現在,我們希望根據USER_ID

mysql使用GROUP BY分組實現前N條記錄方法

cls class ges rom 當前 分組 實現 一個 images MySQL中GROUP BY分組取前N條記錄實現 mysql分組,取記錄 GROUP BY之後如何取每組的前兩位下面我來講述mysql中GROUP BY分組取前N條記錄實現方法。 這是測試表(也

SQL分組某個欄位最大或最小值

  有個表gz: 要按sku分組,同時取每個sku的stock最大的那條 SQL語句: SELECT * FROM (SELECT * FROM gz ORDER BY stock DESC ) a GROUP BY sku 結果: 如果要最小的

oracle 先分組獲取時間最大值

使用者每次登陸都會向表中插入一個登入日期,現在需要獲取最近N位登入的使用者及登陸時間,  因此現根據使用者進行分組,然後在求出每組中最大的日期 SELECT a."RN",a."ID",a."USERCODE",a."LOGINTIME",a."BZ",a."DQCODE"

oracle 先分組獲取最大值的該條全部資訊展示

用一個例項說明:TEST表我現在想用MM欄位分組,取得DD日期為最新的那一條詳細資料SELECTa.* FROM( SELECT ROW_NUMBER () OVER ( PARTITION BY MM

oracle分組中最大的值

  查詢username,根據fundcode分組,按照date倒序,取date最大的一條資料 select * from ( select username, row_number() over(partition by fundcode, order by date desc) r

sql server 分組的前幾行資料

sql中group by後,獲取每組中的前N行資料,目前我知道的有2種方法 比如有個成績表: 裡面有欄位學生ID,科目,成績。我現在想取每個科目的頭三名。  1.   子查詢 select * from score s where StudentName in (selec

分組查詢最新的資料

CREATE TABLE cy_biz_message ( id INT AUTO_INCREMENT COMMENT '主鍵' PRIMARY KEY, send_id INT

thinkphp下group by分組獲取最新資料

$lock = M('locked_record'); $type = 1; $subQuery = $lock->table('sys_locked_record') ->where(array('type'=>$type)) ->order('

分組查詢最大時間記錄方法Oracle

sql語句: [sql]  create table dispatch_result  (      dr_id             &n

mysql分組前幾條記錄(排名) 附group by與order by的研究

select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name--方法2:select a.* from tb a where not exists(select 1 from tb 

mysql分組前幾條記錄

1、表SQL: DROP TABLE IF EXISTS `ho_archives`; CREATE TABLE `ho_archives` (   `id` mediumint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',

Mysql和Oracl 分組前N條記錄

MySQL取每組的前N條記錄:使用自連線的方式一、對分組的記錄取前N條記錄:例子:取前 2條最大(小)的記錄1234567891011121314151617181.用子查詢:SELECT * FROM right2 a  WHERE 2>(SELECT COUNT(*

MySQL的前N條記錄

  MySQL 分組後取每組前N條資料 與oracle的 rownumber() over(partition by xxx  order by xxx )語句類似,即:對錶分組後排序 CREATE TABLE `mygoods` ( `goods

MySQL 分組,統計記錄

嵌套 lec .cn images 分享 ron 都是 log mysql 分組後,統計記錄條數:   SELECT num,count(*) AS counts from test_a GROUP BY num;   查詢結果如下:    對num去重後的數量的統計

mysql分組之後每個的前三個

from sco course and select 判斷 是不是 core score SELECT * FROM course a WHERE 3>(SELECT COUNT(*) FROM course WHERE coursename=a.coursename