前言:前段時間看到MariaDB10.2出測試版本了,心想有什么新特性玩玩,大家都知道MySQL不支持分析函數,但是MariaDB10.2.X支持分析函數了,
1.表結構
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` varchar(30) NOT NULL COMMENT '用戶ID',
`orderId` varchar(60) NOT NULL DEFAULT '' COMMENT '訂單ID',
`channerId` varchar(60) NOT NULL DEFAULT '' COMMENT '充值渠道',
`amount` int(11) DEFAULT NULL COMMENT '充值金額',
PRIMARY KEY (`id`),
KEY `idx_userid` (`userId`),
KEY `idx_channerId` (`channerId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2.插入測試數據
insert into t1 (userId, orderId, channerId, amount) values('張3','2016060101','支付寶',100);
insert into t1 (userId, orderId, channerId, amount) values('李4','2016060102','支付寶',98);
insert into t1 (userId, orderId, channerId, amount) values('張3','2016060103','易票聯',60);
insert into t1 (userId, orderId, channerId, amount) values('張3','2016060104','銀聯',120);
insert into t1 (userId, orderId, channerId, amount) values('王5','2016060105','微信',170);
insert into t1 (userId, orderId, channerId, amount) values('張3','2016060106','微信',40);
insert into t1 (userId, orderId, channerId, amount) values('張3','2016060107','支付寶',200);
insert into t1 (userId, orderId, channerId, amount) values('張3','2016060108','易支付',10);
insert into t1 (userId, orderId, channerId, amount) values('張3','2016060109','微信','80);
insert into t1 (userId, orderId, channerId, amount) values('李4','2016060110','支付寶',300);
insert into t1 (userId, orderId, channerId, amount) values('李4','2016060111','銀聯',40);
insert into t1 (userId, orderId, channerId, amount) values('李4','2016060112','錢包',72);
insert into t1 (userId, orderId, channerId, amount) values('趙6','2016060113','閃付',20);
insert into t1 (userId, orderId, channerId, amount) values('田7','2016060114','錢包',80);
insert into t1 (userId, orderId, channerId, amount) values('劉1','2016060115','微信',60);
insert into t1 (userId, orderId, channerId, amount) values('哈2','2016060116','易支付',82);
3.查詢每個充值渠道的總金額
MariaDB [test11]> select channerId,sum(amount) over(partition by channerId) from t1;
+-----------+------------------------------------------+
| channerId | sum(amount) over(partition by channerId) |
+-----------+------------------------------------------+
| 支付寶 | 698 |
| 支付寶 | 698 |
| 易票聯 | 60 |
| 銀聯 | 160 |
| 微信 | 350 |
| 微信 | 350 |
| 支付寶 | 698 |
| 易支付 | 92 |
| 微信 | 350 |
| 支付寶 | 698 |
| 銀聯 | 160 |
| 錢包 | 152 |
| 閃付 | 20 |
| 錢包 | 152 |
| 微信 | 350 |
| 易支付 | 92 |
+-----------+------------------------------------------+
16 rows in set (0.02 sec)
MariaDB [test11]> select * from (
-> select channerId,sum(amount) over(partition by channerId) from t1) a
-> GROUP BY channerId;
+-----------+------------------------------------------+
| channerId | sum(amount) over(partition by channerId) |
+-----------+------------------------------------------+
| 微信 | 350 |
| 支付寶 | 698 |
| 易支付 | 92 |
| 易票聯 | 60 |
| 錢包 | 152 |
| 銀聯 | 160 |
| 閃付 | 20 |
+-----------+------------------------------------------+
7 rows in set (0.02 sec)
4.查詢每個渠道平均充值金額
MariaDB [test11]> select channerId,avg(amount) over(partition by channerId) from t1
-> ;
+-----------+------------------------------------------+
| channerId | avg(amount) over(partition by channerId) |
+-----------+------------------------------------------+
| 支付寶 | 174.5000 |
| 支付寶 | 174.5000 |
| 易票聯 | 60.0000 |
| 銀聯 | 80.0000 |
| 微信 | 87.5000 |
| 微信 | 87.5000 |
| 支付寶 | 174.5000 |
| 易支付 | 46.0000 |
| 微信 | 87.5000 |
| 支付寶 | 174.5000 |
| 銀聯 | 80.0000 |
| 錢包 | 76.0000 |
| 閃付 | 20.0000 |
| 錢包 | 76.0000 |
| 微信 | 87.5000 |
| 易支付 | 46.0000 |
+-----------+------------------------------------------+
16 rows in set (0.01 sec)
MariaDB [test11]> select * from (
-> select channerId,avg(amount) over(partition by channerId) from t1) a
-> GROUP BY channerId;
+-----------+------------------------------------------+
| channerId | avg(amount) over(partition by channerId) |
+-----------+------------------------------------------+
| 微信 | 87.5000 |
| 支付寶 | 174.5000 |
| 易支付 | 46.0000 |
| 易票聯 | 60.0000 |
| 錢包 | 76.0000 |
| 銀聯 | 80.0000 |
| 閃付 | 20.0000 |
+-----------+------------------------------------------+
7 rows in set (0.00 sec)
5.查詢每個渠道最小充值金額
MariaDB [test11]> select * from ( select channerId,min(amount) over(partition by channerId) from t1) a GROUP BY channerId;
ERROR 1235 (42000): This version of MariaDB doesn't yet support 'This aggregate as window function'
可惜不支持
6.查詢每個驅動最大充值金額
MariaDB [test11]> select * from ( select channerId,max(amount) over(partition by channerId) from t1) a GROUP BY channerId;
ERROR 1235 (42000): This version of MariaDB doesn't yet support 'This aggregate as window function'
MariaDB [test11]>
聰明的你,一下子猜測到不支持
#7.根據每個充值渠道,根據充值金額排名
MariaDB [test11]> SELECT RANK() OVER (PARTITION BY channerId ORDER BY amount desc ) AS rank, DENSE_RANK() OVER (PARTITION BY channerId ORDER BY amount desc ) AS dense_rank, ROW_NUMBER() OVER (PARTITION BY channerId ORDER BY amount desc) AS row_num, userId,channerId,amount from t1 ;
+------+------------+---------+--------+-----------+--------+
| rank | dense_rank | row_num | userId | channerId | amount |
+------+------------+---------+--------+-----------+--------+
| 3 | 3 | 3 | 張3 | 支付寶 | 100 |
| 4 | 4 | 4 | 李4 | 支付寶 | 98 |
| 1 | 1 | 1 | 張3 | 易票聯 | 60 |
| 1 | 1 | 1 | 張3 | 銀聯 | 120 |
| 1 | 1 | 1 | 王5 | 微信 | 170 |
| 4 | 4 | 4 | 張3 | 微信 | 40 |
| 2 | 2 | 2 | 張3 | 支付寶 | 200 |
| 2 | 2 | 2 | 張3 | 易支付 | 10 |
| 2 | 2 | 2 | 張3 | 微信 | 80 |
| 1 | 1 | 1 | 李4 | 支付寶 | 300 |
| 2 | 2 | 2 | 李4 | 銀聯 | 40 |
| 2 | 2 | 2 | 李4 | 錢包 | 72 |
| 1 | 1 | 1 | 趙6 | 閃付 | 20 |
| 1 | 1 | 1 | 田7 | 錢包 | 80 |
| 3 | 3 | 3 | 劉1 | 微信 | 60 |
| 1 | 1 | 1 | 哈2 | 易支付 | 82 |
+------+------------+---------+--------+-----------+--------+
16 rows in set (0.00 sec)
#排個序,這樣就好看多了,每個渠道充值排名
MariaDB [test11]> SELECT RANK() OVER (PARTITION BY channerId ORDER BY amount desc ) AS rank, DENSE_RANK() OVER (PARTITION BY channerId ORDER BY amount desc ) AS dense_rank, ROW_NUMBER() OVER (PARTITION BY channerId ORDER BY amount desc) AS row_num, userId,channerId,amount from t1 order by 5,1;
+------+------------+---------+--------+-----------+--------+
| rank | dense_rank | row_num | userId | channerId | amount |
+------+------------+---------+--------+-----------+--------+
| 1 | 1 | 1 | 王5 | 微信 | 170 |
| 2 | 2 | 2 | 張3 | 微信 | 80 |
| 3 | 3 | 3 | 劉1 | 微信 | 60 |
| 4 | 4 | 4 | 張3 | 微信 | 40 |
| 1 | 1 | 1 | 李4 | 支付寶 | 300 |
| 2 | 2 | 2 | 張3 | 支付寶 | 200 |
| 3 | 3 | 3 | 張3 | 支付寶 | 100 |
| 4 | 4 | 4 | 李4 | 支付寶 | 98 |
| 1 | 1 | 1 | 哈2 | 易支付 | 82 |
| 2 | 2 | 2 | 張3 | 易支付 | 10 |
| 1 | 1 | 1 | 張3 | 易票聯 | 60 |
| 1 | 1 | 1 | 田7 | 錢包 | 80 |
| 2 | 2 | 2 | 李4 | 錢包 | 72 |
| 1 | 1 | 1 | 張3 | 銀聯 | 120 |
| 2 | 2 | 2 | 李4 | 銀聯 | 40 |
| 1 | 1 | 1 | 趙6 | 閃付 | 20 |
+------+------------+---------+--------+-----------+--------+
16 rows in set (0.01 sec)
MariaDB [test11]>
小結
跟Oracle,PostgreSQL, SQL SERVER還是有差距,不過已經很不錯了。希望官方版本也引進這個新特性