SQL | 窗口函数 | 查找N%的数据

剔除访问次数前20%的用户后,每类用户的平均访问次数。

用户访问次数表visit_view,

用户编号uid
用户类型utype
访问量uvisit

1、创建表
(1)创建表

CREATE TABLE IF NOT EXISTS visit_view(
uid INT,
utype VARCHAR(255),
uvisit INT
);

(2)插入数据

INSERT INTO visit_view VALUES(10,'A',352),
							 (6,'C',209),
							 (7,'C',110),
							 (4,'E',101),
							 (2,'B',53),
							 (20,'A',53),
							 (11,'C',33),
							 (1,'A',30),
							 (9,'E',29),
							 (8,'B',6);

(3)逻辑SQL
a)如果理解为要剔除访问量排名前20%

mysql> WITH t1 AS (SELECT *,ROW_NUMBER() OVER(ORDER BY uvisit DESC) AS rk
    -> 			   FROM visit_view)
    -> SELECT *
    -> FROM t1
    -> WHERE rk>(SELECT MAX(rk) FROM t1)*0.2;
+------+-------+--------+----+
| uid  | utype | uvisit | rk |
+------+-------+--------+----+
|    7 | C     |    110 |  3 |
|    4 | E     |    101 |  4 |
|    2 | B     |     53 |  5 |
|   20 | A     |     53 |  6 |
|   11 | C     |     33 |  7 |
|    1 | A     |     30 |  8 |
|    9 | E     |     29 |  9 |
|    8 | B     |      6 | 10 |
+------+-------+--------+----+
8 rows in set (0.00 sec)

b) 如果要找到访问量之和占总访问量80%的用户
SUM() OVER() 累积求和

mysql> WITH t1 AS (SELECT *,SUM(uvisit) OVER(ORDER BY uvisit DESC) AS roll_sum
    ->     		   FROM visit_view)
    -> SELECT *
    -> FROM t1
    -> WHERE roll_sum<(SELECT MAX(roll_sum) FROM t1)*0.8;
+------+-------+--------+----------+
| uid  | utype | uvisit | roll_sum |
+------+-------+--------+----------+
|   10 | A     |    352 |      352 |
|    6 | C     |    209 |      561 |
|    7 | C     |    110 |      671 |
|    4 | E     |    101 |      772 |
+------+-------+--------+----------+
4 rows in set (0.00 sec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值