当前位置: 首页 > news >正文

mysql窗口函数、Mysql分析函数

--数据表
CREATE TABLE `tem` ( `id`
int(11) NOT NULL AUTO_INCREMENT, `str` char(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ;INSERT INTO `test`.`tem`(`id`, `str`) VALUES (1, 'A'); INSERT INTO `test`.`tem`(`id`, `str`) VALUES (2, 'B'); INSERT INTO `test`.`tem`(`id`, `str`) VALUES (3, 'A'); INSERT INTO `test`.`tem`(`id`, `str`) VALUES (4, 'C'); INSERT INTO `test`.`tem`(`id`, `str`) VALUES (5, 'A'); INSERT INTO `test`.`tem`(`id`, `str`) VALUES (6, 'C'); INSERT INTO `test`.`tem`(`id`, `str`) VALUES (7, 'B');

【1】row_number() over(order by )

变量会最后再计算,所以是先排序好之后,才会开始计算@num

SELECT@num := @num+1 num,id,str
FROMtem, (SELECT @str := '', @num := 0) t1
ORDER BYstr, id;

image

 

2】实现分组排名效果(row_number() over(partition by order by ))

--变量方式
SELECT@num := IF(@str = str, @num + 1, 1) num,id,@str := str str
FROMtem, (SELECT @str := '', @num := 0) t1
ORDER BYstr, id;

image

 

--子查询方式【取分组中前N行(排名前几名)】
select * from testGroup as a
where a.ID in (select  ID from testGroup b where a.UserID = b.UserID order by b.OrderID limit 2)
--或者
select * from testGroup a
where not exists (select 1 from testGroup b where a.UserID = b.UserID and a.OrderID > b.OrderID 
having count(1) >= 2)
--或者
select * from testGroup a
where (select count(1) from testGroup b where a.UserID = b.UserID and a.ID >= b.ID) <= 2
--没有唯一标识的表,可以用checksum来标识每行(MSSQL?)
select * from testGroup as a
where checksum(*) in (select top 2 checksum(*) from testGroup b where a.UserID = b.UserID order by b.OrderID)
mysql使用子查询实现
create table test1_1(id int auto_increment primary key,`subject` char(20),score int);
insert into test1_1 values(null,'语文',99),(null,'语文',98),(null,'语文',97);
insert into test1_1 values(null,'数学',89),(null,'数学',88),(null,'数学',87);
insert into test1_1 values(null,'英语',79),(null,'英语',78),(null,'英语',77);-- 根据成绩,求出每个科目的前2名select * from test1_1;

image

 

select * from test1_1 t1
where (select count(1) from test1_1 t2 where t1.subject=t2.subject and t2.score>=t1.score ) <=2;

image

 

【3】实现dense_rank() over(order by)

--变量会最后再计算,所以是先排序好之后,才会开始计算@numselect id,@num:=IF(@STR=STR,@num,@num+1) rn,@str:=str str
from tem t1,(select @str:='',@num:=0) t2 
order by str 

image

 

--错误的方式
select id,str,
case when @str=str then @num
when @str:=str then @num:=@num+1 end as 'rn'
from tem t1,(select @str:='',@num:=1) t2 
order by str

image

 case when 形式,但该方法在mysql5.5中,只支持非0数字排序生成,字符会有大问题(任意字符被case when 'a' then else end,都会走else),且赋值语句等于0时也为假

--正确的方式
select id,str,
case when @str=str then @num
when @str:=str then @num:=@num+1 
else @num:=@num+1 end as 'rn'
from tem t1,(select @str:='',@num:=0) t2 
order by str

image

 

【4】rank() over()

select 
*,
--score,
@a:=@a +(@pre<>(@pre:=score)) as rank
from
score,
(select @a:=0,@pre:=-1) t
order by 
score desc; 

 

image

 

http://www.jsqmd.com/news/373449/

相关文章:

  • 如何快速回收分期乐京东超市购物卡?变现技巧全攻略 - 团团收购物卡回收
  • RAG十年演进
  • Infra十年演进
  • 同程与飞猪出票失败频率及反复确认现象对比分析:2026年主流旅行平台消费体验测评报告 - 资讯焦点
  • OTA平台价格波动场景测评:同程、去哪儿、携程、飞猪的消费体验对比 - 资讯焦点
  • ESA Pages让AI生成网站
  • ABB PFTL 201D-50.0-3BSE008922R50
  • 四大旅行平台国际机票退改签规则处理体验横向测评报告 - 资讯焦点
  • 港华商会与碳启元合作,引领绿色商业碳中和新风向
  • 2026别错过!AI论文平台,千笔 VS Checkjie,专为本科生量身打造!
  • 2026上半年软考程序员备考:案例模拟题练习(2)
  • 2026南昌精品粤菜主题宴会餐厅推荐榜 - 资讯焦点
  • 2026更新版!AI论文平台 千笔写作工具 VS 文途AI,专为本科生打造!
  • 能用很多文献写文章的AI有哪些?2026年6款AI论文工具,帮你搞定各类学术论文! - 掌桥科研-AI论文写作
  • 冬虫夏草那家店最好?2026十强权威榜单揭秘,产地、成分、工艺全链路实测对比 - 资讯焦点
  • 高通平台 Android T 蓝牙技术全解析:A2DP 与 AVRCP 核心代码路径与交互流程
  • 能用很多文献写文章的AI有哪些?2026年6款写论文的AI软件排行榜,支持一键生成功能! - 掌桥科研-AI论文写作
  • 教室照明改造标准升级,近视防控从一盏灯开始
  • Wi-Fi 技术学习:无线DFS测试的环境搭建、参数配置与日志记录详解
  • 定稿前必看!一键生成论文工具 千笔写作工具 VS 灵感ai
  • 2026年诚信的检针机,检针器厂家选型推荐名录 - 品牌鉴赏师
  • 2026年2月重量选别机厂家权威推荐,食品医药行业专用检测设备 - 品牌鉴赏师
  • C#每日面试题-var和dynamic区别
  • 2026服务全面的私人医生机构:在专业与效率中如何选择健康管理伙伴? - 资讯焦点
  • 2026高端居家养老企业推荐与排名:医养结合服务专业度深度评测 - 资讯焦点
  • 2026看这里!苏州口碑好的八段锦线下教学推荐,擒拿/太极刀/站桩/春秋大刀/八段锦/太极推手,八段锦线下教学推荐 - 品牌推荐师
  • 2026年拉伸膜源头厂家年度排名,这些品牌价格与质量对比解析 - 工业品网
  • 超越均值与方差:批归一化(Batch Normalization)的深度解析、高效实现与演进思考
  • 【并发编程实战】10、Java线程数设置实战:CPU/I/O密集型场景最优配置 - 实践
  • 2026年好评如潮!精选扩香器厂家,打造居家香气新体验,香薰机/香氛扩香机/减压香氛,扩香器ODM源头厂家找哪家 - 品牌推荐师