SqlServer中 Partition By 的使用
1:数据库表结构:
(产品图片表)
select * from product_imgs
2:应用场景:
可见表中每一个产品(pro_id)可能对应多个图片(img),我想要按照添加时间的先后顺序,获得其中每一个产品的第一张图片
3:尝试使用 group by
select top 1 pro_id,img,create_time from product_imgs group by pro_id,img,create_time order by create_time
发现无法满足每一个产品的图片
4:使用Partition by
select * from (select pro_id,img,create_time, ROW_NUMBER() over(partition by pro_id order by create_time) as row_sort from product_imgs )as t where t.row_sort=1
可以满足需求,所以Partition by可以理解为 对多行数据分组后排序取每个产品的第一行数据
--20180712补充
最近又发现 cross apply 在联表的时候可以代替 partition by ,查询的效果是一样的
select a.id,a.title,t.* from Product as a
cross apply
(select top 1 b.pro_id,b.img from product_imgs as b where b.pro_id=a.id)
as t
--20190311补充
1.应用场景:查询学生最近一次各分类的体测成绩的分数
DECLARE @beginTime DATETIME = '2018-02-25 00:00:00'; -- datetime
DECLARE @endTime DATETIME = '2019-07-13 00:00:00'; -- datetime
DECLARE @schoolId VARCHAR(100) = '3301080020'; -- datetime
DECLARE @classId VARCHAR(100) = '33010800202018001'; -- datetime
DECLARE @groupId VARCHAR(100) = '761'; -- datetime--1.Cross APPLY + PARTITION bySELECT a.student_id,c.type,c.score,c.NewCol FROM dbo.Student AS aCROSS APPLY(SELECT b.student_id,b.type,b.score,ROW_NUMBER() OVER(PARTITION BY b.type ORDER BY b.intime desc) AS NewColFROM dbo.StudentTest AS bWHERE b.intime BETWEEN @beginTime AND @endTimeAND type IN (1,2,3,6,7,8) AND a.student_id=b.student_id--GROUP BY b.student_id,b.type,b.score,b.intime)AS cWHERE a.class_id=@classId AND c.NewCol=1--2.Left Join + PARTITION by
DECLARE @beginTime DATETIME = '2018-02-25 00:00:00'; -- datetime
DECLARE @endTime DATETIME = '2019-07-13 00:00:00'; -- datetime
DECLARE @schoolId VARCHAR(100) = '3301080020'; -- datetime
DECLARE @classId VARCHAR(100) = '33010800202018001'; -- datetime
DECLARE @groupId VARCHAR(100) = '761'; -- datetime
SELECT a.student_id,c.type,c.score,c.NewCol FROM dbo.Student AS a
LEFT JOIN (SELECT b.student_id,b.type,b.score,ROW_NUMBER() OVER(PARTITION BY b.student_id,b.type ORDER BY b.intime desc) AS NewColFROM dbo.StudentTest AS bWHERE b.intime BETWEEN @beginTime AND @endTimeAND type IN (1,2,3,6,7,8))AS c ON a.student_id=c.student_idWHERE a.class_id=@classIdAND c.NewCol=1
2.两者区别:
CrossApply 由于在内指定了联表字段,故Partition By不用加StudentId分组,而Left Join 在外指定联表字段,故Partition By不用加StudentId分组
注:inner join 和 cross apply的不同,点击 https://blog.csdn.net/liuchang19950703/article/details/81015853
SqlServer中 Partition By 的使用相关推荐
- 简单介绍SQLserver中的declare变量用法
这篇文章主要介绍了SQLserver中的declare变量用法,sql中declare是声明的意思,就是声明变量的,这个一般是用在函数和存储过程中的.感兴趣的可以来了解一下 平时写SQL查询.存储过程 ...
- sqlserver中能用when_sqlserver中if语句顶替when.case.语句
sqlserver中if语句替代when...case..语句 create table Employees ( EmployeeID char(6) primary key not null, Na ...
- 关于Sqlserver中 BCP命令,实现数据导出功能。
关于Sqlserver中 BCP命令,实现数据导出功能. exec master..xp_cmdshell 'bcp "select 账号 ,姓名, 账号 from datat.dbo.个人 ...
- SQLSERVER中统计所有表的记录数
SQLSERVER中统计所有表的记录数 利用系统索引表sysindexes中索引ID indid<1的行中的rows列存有该表的行数这一特点. 方法是利用隐藏未公开的系统存储过程sp_MS ...
- 我是如何在SQLServer中处理每天四亿三千万记录的
原文地址:http://www.cnblogs.com/marvin/p/HowCanIHandleBigDataBySQLServer.html 首先声明,我只是个程序员,不是专业的DBA,以下这篇 ...
- SQLServer中使用Split功能分割字符串
一般的开发语言中,都有Split函数,可以将某个字符串按照分隔符进行分割,返回一个数组,非常方便. 但在SQLServer中,却没有默认提供Split函数,不过总有解决方案,以下是某大牛写的,比起网上 ...
- SQLSERVER中的网络配置
关于sqlserver中的网络配置,以前也用sqlserver2005做过东西,有时连接出错时,不是baidu就是google,对于这些常见的东西,一点都不明白是什么意思,惭愧啊,今天看了本书,写的不 ...
- sqlserver中,如果正确得到中文的长度
sqlserver中,如果正确得到中文的长度: len('wangzhq')=7 len('代码')=2 正确: data ...
- SQLServer中进行sql除法运算结果为小数时显示0的解决方案
SQLServer中进行sql除法运算结果为小数时显示0的解决方案 参考文章: (1)SQLServer中进行sql除法运算结果为小数时显示0的解决方案 (2)https://www.cnblogs. ...
最新文章
- php微信开发例子,微信开发实战之知乎日报
- php api 20121113,php添加gd
- typescirpt 知识点
- python去重复的数据_Python中mysql查询重复数据并删除重复数据
- Server error for SAP CRM_BUPA_ODATA
- linux常用架构,Linux常用到的一些命令-Go语言中文社区
- php format tool,usb 開機碟製作工具HP USB Disk Storage format Tool 2.23
- 计算机应用教程 卢湘鸿答案,计算机应用教程(Windows 2000环境)习题解答与实验指导...
- 命令行工具抓取trace
- iPhone无法更新,一直卡住在“验证更新中”,如何处理?
- oracle数据库应用与开发习题,oracle数据库应用与开发答案
- Linux内核中的延时函数详解
- input输入框只能输入字母
- ruoyi框架分页总条数total返回错误解决方案
- HoloLens2的vuforia模型识别
- OpenCV应用:将jpg格式的图片转为bmp格式的图片
- 没钱也能创业?7个零成本就能启动的轻项目
- 如何批量去水印?水印云批量去水印工具
- EditText软键盘的显示隐藏及焦点问题
- 猜数字1~100内的数字
热门文章
- 关于计算机网络技术多用复路,自考计算机网络技术练习题
- Linux看硬盘同步,从磁盘同步看linux的机制和策略
- ethercat如何编程 台达50mc_台达可编程控制器DVP-50MC系列产品介绍
- linux安装qq_一分钟,轻松上手 Linux 安装QQ,让你简单开启聊天办公新环境
- vba两个集合的差集_Python中的集合是如何使用的?
- Django项目:CMDB(服务器硬件资产自动采集系统)--11--07CMDB文件模式测试采集硬件数据...
- Binary Tree Zigzag Level Order Traversal
- RN和React路由详解及对比
- 【零基础学Java】—finally代码块(四十七)
- r语言调用python_python如何调用R