Mysql实现rank和sum over窗口函数示例

Mysql8.0以下版本是不支持窗口函数的,下面简单演示了mysql如何通过@变量实现rank和sum over窗口函数。各位读者可以以此举一反三。


数据准备:

CREATE TABLE sc (
  SId VARCHAR(10),
  CId VARCHAR(10),
  score INT
 );
 
 INSERT INTO sc (SId, CId, score)
 VALUES
  ('01', '01', 80),
  ('01', '02', 90),
  ('01', '03', 99),
  ('02', '01', 70),
  ('02', '02', 60),
  ('02', '03', 80),
  ('03', '01', 80),
  ('03', '02', 80),
  ('03', '03', 80),
  ('04', '01', 50),
  ('04', '02', 30),
  ('04', '03', 20),
  ('05', '01', 76),
  ('05', '03', 77);
 
 CREATE TABLE t_access_times (
  USER VARCHAR(10),
   DATE DATE,
   COUNT INT
 );
 
 INSERT INTO t_access_times (USER, DATE, COUNT)
 VALUES
  ('A', '2015-01-02', 5),
  ('A', '2015-01-03', 15),
  ('B', '2015-01-01', 5),
  ('A', '2015-01-04', 8),
  ('B', '2015-01-05', 25),
  ('A', '2015-01-06', 5),
  ('A', '2015-02-02', 4),
  ('A', '2015-02-06', 6),
  ('B', '2015-02-06', 10),
  ('B', '2015-02-07', 5);


实现rank

不分组全局排名

 SELECT s.*,@r :=@r + 1 AS rank
 FROM sc s,(SELECT @r := 0) r
 ORDER BY score DESC;

按照班级分组的每个学生成绩排名

 SELECT a.cid,a.sid,a.score,a.rank
 FROM  
 (
   SELECT s.*,
   IF(@p=cid,@r:=@r+1,@r:=1) AS rank,
   @p:=cid
   FROM sc s,(SELECT @p:=0,@r:=0)r
   ORDER BY cid,score DESC
 )a;


更多关于rank的示例可以参考:

分组排序求前三?TopN问题?一文教你MySQL各类排序操作

引用自:https://blog.csdn.net/weixin_41261833/article/details/103511400


实现sum over

全表累积求和

 SELECT t.*,@c :=@c + COUNT AS accumulate
 FROM t_access_times t,(SELECT @c := 0) c
 ORDER BY USER,DATE;


分组的累积求和

 SELECT a.user,a.date,a.count,a.accumulate
 FROM  
 (
   SELECT t.*,
   IF(@p=USER,@r:=@r+COUNT,@r:=COUNT) AS accumulate,
   @p:=USER
   FROM t_access_times t,(SELECT @p:=0,@c:=0)c
   ORDER BY USER,DATE
 )a;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小明-代码实体

喜欢,就关注;爱,就打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值