MariaDB10.2.X-新特性1-支持分析函數


前言:前段時間看到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還是有差距,不過已經很不錯了。希望官方版本也引進這個新特性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM