MySQL使用自定義變數模擬分析函式
初始化實驗結構和資料
要求:
Stat表示狀態,Createtime表示建立時間
查詢每種狀態最近3個記錄的內容
這個需求似曾相識
http://blog.itpub.net/29254281/viewspace-1257510/
但是這回是MySQL資料庫了。他沒有分析函式,只能用自定義變數模擬
test表的stat欄位為分組標識
gid是上一個記錄的分組標識,
cgid是當前記錄的分組標識,
如果gid和cgid不等,說明分組標識已經變了,Rank排序重置
這樣Rank是按照每個分組進行自增的,取前N個記錄就可以了。
結果:
MySQL實現每個分組隨機抽取N個記錄的功能
(前面連結中的功能)
----------------------------分割線---------------------------------
上面這些都是使用MySQL自定義變數模擬分析函式,
使用傳統的相關子查詢也可以實現這個功能,只是效率低
參考:
http://blog.itpub.net/29254281/viewspace-1142071/
-
create table test(
-
tid varchar(32) primary key,
-
stat int not null,
-
createtime timestamp not null
-
);
-
INSERT INTO test (tid,stat,createtime) VALUES ('ac551ad7ba3f9067b19ac8bb20caca6d',-1,'2014-08-20 10:01:09');
-
INSERT INTO test (tid,stat,createtime) VALUES ('dc9a4438e577f4b08f7033a305544d47',-1,'2014-08-20 10:00:19');
-
INSERT INTO test (tid,stat,createtime) VALUES ('23055228532bbba5a68d6ada11bcf33f',-1,'2014-08-20 09:58:32');
-
INSERT INTO test (tid,stat,createtime) VALUES ('5711ee1610d07a55e64c7948667de6e8',-1,'2014-08-20 09:58:09');
-
INSERT INTO test (tid,stat,createtime) VALUES ('035e06d8afd681a9904bd74e9860f8cb',-1,'2014-08-20 09:57:52');
-
INSERT INTO test (tid,stat,createtime) VALUES ('3890efc08f37fa489a4e130cb04f71ac',-1,'2014-08-20 09:57:48');
-
INSERT INTO test (tid,stat,createtime) VALUES ('1b6ed9db663dae470b45c722a61d08b0',-1,'2014-08-20 09:56:40');
-
INSERT INTO test (tid,stat,createtime) VALUES ('8fb3409015e6b2cf85ba6ee90f15b58f',-1,'2014-08-20 09:54:40');
-
INSERT INTO test (tid,stat,createtime) VALUES ('0badb1f4c2b1a89f1c473b992183add3',-1,'2014-08-20 09:54:33');
-
INSERT INTO test (tid,stat,createtime) VALUES ('89b8af5eb473b2d4f50dd9e10773a9cc',-1,'2014-08-20 09:53:54');
-
INSERT INTO test (tid,stat,createtime) VALUES ('77923a7397110224b5f94e7d0bd297de',2,'2014-08-19 17:13:17');
-
INSERT INTO test (tid,stat,createtime) VALUES ('0df1da77cfdbe64edcd4d645197174af',2,'2014-08-19 12:20:21');
-
INSERT INTO test (tid,stat,createtime) VALUES ('43daef6bfbc46dbfdbb97e74173dab30',2,'2014-08-19 09:54:08');
-
INSERT INTO test (tid,stat,createtime) VALUES ('d5d12c510391314f48054c6c9ab9535c',2,'2014-08-19 09:23:41');
-
INSERT INTO test (tid,stat,createtime) VALUES ('f7c123143752498b7c9a226a9583ae49',2,'2014-08-19 01:14:21');
-
INSERT INTO test (tid,stat,createtime) VALUES ('da6a9a78897a42ae0a565cd0fabd76bb',2,'2014-08-18 21:59:46');
-
INSERT INTO test (tid,stat,createtime) VALUES ('9cd3f83ab04120504a880523702491d7',2,'2014-08-18 16:26:30');
-
INSERT INTO test (tid,stat,createtime) VALUES ('4dfa129ba64e7062afa37e56bb9632de',2,'2014-08-18 14:32:41');
-
INSERT INTO test (tid,stat,createtime) VALUES ('a9a731870e1c02278c22ce1ab36fa43c',2,'2014-08-18 14:31:26');
-
INSERT INTO test (tid,stat,createtime) VALUES ('97f39d2a1e519f99e602e72cfc45fe0c',2,'2014-08-17 11:47:52');
-
INSERT INTO test (tid,stat,createtime) VALUES ('31ba95265a96971221ddf9320c79eed8',3,'2014-08-20 02:08:50');
-
INSERT INTO test (tid,stat,createtime) VALUES ('060d92222edcb6f583cb4cd0244aadc0',3,'2014-08-20 02:05:54');
-
INSERT INTO test (tid,stat,createtime) VALUES ('7d3eb4ea201906b08e961b9fe7726fd4',3,'2014-08-20 02:00:11');
-
INSERT INTO test (tid,stat,createtime) VALUES ('c633bc16cb8c3bb4ffa7f00682701b92',3,'2014-08-20 01:54:22');
-
INSERT INTO test (tid,stat,createtime) VALUES ('e43bb7e7274259712b389e3feabc068f',3,'2014-08-20 01:49:36');
-
INSERT INTO test (tid,stat,createtime) VALUES ('bdabf3d80fb097222112cb30cdc48117',3,'2014-08-20 01:48:48');
-
INSERT INTO test (tid,stat,createtime) VALUES ('170e2bdc11d517a56b7ce23d85633e42',3,'2014-08-20 01:46:56');
-
INSERT INTO test (tid,stat,createtime) VALUES ('7e79f6065ae8bb215cee43a4efbcd852',3,'2014-08-20 01:44:17');
-
INSERT INTO test (tid,stat,createtime) VALUES ('04728676e3305de05a18333ddfc76c01',3,'2014-08-20 01:39:05');
-
INSERT INTO test (tid,stat,createtime) VALUES ('d987176d350d4fefcc92b9a7ebb4f288',3,'2014-08-20 01:35:52');
- COMMIT;
要求:
Stat表示狀態,Createtime表示建立時間
查詢每種狀態最近3個記錄的內容
這個需求似曾相識
http://blog.itpub.net/29254281/viewspace-1257510/
但是這回是MySQL資料庫了。他沒有分析函式,只能用自定義變數模擬
test表的stat欄位為分組標識
gid是上一個記錄的分組標識,
cgid是當前記錄的分組標識,
如果gid和cgid不等,說明分組標識已經變了,Rank排序重置
這樣Rank是按照每個分組進行自增的,取前N個記錄就可以了。
-
SELECT t3.tid, t3.stat, t3.createtime
-
FROM (SELECT @gid := @cgid, @cgid := t1.stat, if(@gid = @cgid, @rank := @rank + 1, @rank := 1) AS rank, t1.*
-
FROM (SELECT *
-
FROM test
-
ORDER BY stat, createtime DESC
- ) t1, (SELECT @gid := 1, @cgid := 1, @rank := 1) t2
-
) t3
- WHERE t3.rank <= 3;
MySQL實現每個分組隨機抽取N個記錄的功能
(前面連結中的功能)
-
SELECT t3.tid, t3.stat, t3.createtime
-
FROM (SELECT @gid := @cgid, @cgid := t1.stat, if(@gid = @cgid, @rank := @rank + 1, @rank := 1) AS rank, t1.*
-
FROM (SELECT *
-
FROM test
-
ORDER BY stat, rand()
- ) t1, (SELECT @gid := 1, @cgid := 1, @rank := 1) t2
-
) t3
- WHERE t3.rank <= 3;
----------------------------分割線---------------------------------
上面這些都是使用MySQL自定義變數模擬分析函式,
使用傳統的相關子查詢也可以實現這個功能,只是效率低
-
SELECT t1.tid, t1.stat, t1.createtime
-
FROM test t1
-
WHERE (
-
SELECT COUNT(*)
-
FROM test t2
-
WHERE t2.stat = t1.stat
-
AND t1.createtime < t2.createtime
-
) < 3
- ORDER BY stat, createtime DESC
http://blog.itpub.net/29254281/viewspace-1142071/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1257911/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL自定義變數實現row_number分析函式的天坑MySql變數函式
- mysql 自定義分析函式 least 及 日期函式MySql函式AST
- 自定義生成器函式模擬Python內建函式filter()函式PythonFilter
- MySQL使用之五_自定義函式和自定義過程MySql函式
- MySQL建立自定義函式MySql函式
- mysql自定義函式篇MySql函式
- MySQL全面瓦解18:自定義函式MySql函式
- mysql中自定義變數有哪些MySql變數
- MySQL自定義變數執行順序MySql變數
- Oracle帶引數的自定義函式Oracle函式
- 使用 CSS 自定義屬性(變數)CSS變數
- MySQL自定義函式與儲存過程MySql函式儲存過程
- Linux Shell 自定義函式(定義、返回值、變數作用域)介紹Linux函式變數
- MySQL自定義變數的三個小技巧MySql變數
- shell自定義函式函式
- Oracle 自定義函式Oracle函式
- perl自定義函式函式
- 函式索引使用細節——自定義函式的索引化函式索引
- Clickhouse 使用者自定義外部函式函式
- matlab自定義函式建立與使用Matlab函式
- 7.yii中使用自定義函式函式
- 自定義函式索引使用及其注意點函式索引
- 數值得整數次方--模擬pow函式的功能函式
- Hive常用函式及自定義函式Hive函式
- Mysql中儲存過程、儲存函式、自定義函式、變數、流程控制語句、游標/遊標、定義條件和處理程式的使用示例MySql儲存過程儲存函式變數
- Loadrunner 使用者自定義函式使用[轉]函式
- MySQL自定義變數處理行號問題MySql變數
- hive 3.0.0自定義函式Hive函式
- Hive中自定義函式Hive函式
- python 自定義函式Python函式
- oracle 自定義聚合函式Oracle函式
- Oracle中自定義函式Oracle函式
- 一個自定義函式函式
- Oracle自定義聚集函式Oracle函式
- ORACLE 自定義函式BUG?Oracle函式
- SQL SERVER 自定義函式SQLServer函式
- SQL 自定義函式FUNCTIONSQL函式Function
- Nginx 如何自定義變數?Nginx變數