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 的使用相关推荐

  1. 简单介绍SQLserver中的declare变量用法

    这篇文章主要介绍了SQLserver中的declare变量用法,sql中declare是声明的意思,就是声明变量的,这个一般是用在函数和存储过程中的.感兴趣的可以来了解一下 平时写SQL查询.存储过程 ...

  2. sqlserver中能用when_sqlserver中if语句顶替when.case.语句

    sqlserver中if语句替代when...case..语句 create table Employees ( EmployeeID char(6) primary key not null, Na ...

  3. 关于Sqlserver中 BCP命令,实现数据导出功能。

    关于Sqlserver中 BCP命令,实现数据导出功能. exec master..xp_cmdshell 'bcp "select 账号 ,姓名, 账号 from datat.dbo.个人 ...

  4. SQLSERVER中统计所有表的记录数

    SQLSERVER中统计所有表的记录数 利用系统索引表sysindexes中索引ID indid<1的行中的rows列存有该表的行数这一特点.    方法是利用隐藏未公开的系统存储过程sp_MS ...

  5. 我是如何在SQLServer中处理每天四亿三千万记录的

    原文地址:http://www.cnblogs.com/marvin/p/HowCanIHandleBigDataBySQLServer.html 首先声明,我只是个程序员,不是专业的DBA,以下这篇 ...

  6. SQLServer中使用Split功能分割字符串

    一般的开发语言中,都有Split函数,可以将某个字符串按照分隔符进行分割,返回一个数组,非常方便. 但在SQLServer中,却没有默认提供Split函数,不过总有解决方案,以下是某大牛写的,比起网上 ...

  7. SQLSERVER中的网络配置

    关于sqlserver中的网络配置,以前也用sqlserver2005做过东西,有时连接出错时,不是baidu就是google,对于这些常见的东西,一点都不明白是什么意思,惭愧啊,今天看了本书,写的不 ...

  8. sqlserver中,如果正确得到中文的长度

    sqlserver中,如果正确得到中文的长度:             len('wangzhq')=7          len('代码')=2             正确:       data ...

  9. SQLServer中进行sql除法运算结果为小数时显示0的解决方案

    SQLServer中进行sql除法运算结果为小数时显示0的解决方案 参考文章: (1)SQLServer中进行sql除法运算结果为小数时显示0的解决方案 (2)https://www.cnblogs. ...

最新文章

  1. php微信开发例子,微信开发实战之知乎日报
  2. php api 20121113,php添加gd
  3. typescirpt 知识点
  4. python去重复的数据_Python中mysql查询重复数据并删除重复数据
  5. Server error for SAP CRM_BUPA_ODATA
  6. linux常用架构,Linux常用到的一些命令-Go语言中文社区
  7. php format tool,usb 開機碟製作工具HP USB Disk Storage format Tool 2.23
  8. 计算机应用教程 卢湘鸿答案,计算机应用教程(Windows 2000环境)习题解答与实验指导...
  9. 命令行工具抓取trace
  10. iPhone无法更新,一直卡住在“验证更新中”,如何处理?
  11. oracle数据库应用与开发习题,oracle数据库应用与开发答案
  12. Linux内核中的延时函数详解
  13. input输入框只能输入字母
  14. ruoyi框架分页总条数total返回错误解决方案
  15. HoloLens2的vuforia模型识别
  16. OpenCV应用:将jpg格式的图片转为bmp格式的图片
  17. 没钱也能创业?7个零成本就能启动的轻项目
  18. 如何批量去水印?水印云批量去水印工具
  19. EditText软键盘的显示隐藏及焦点问题
  20. 猜数字1~100内的数字

热门文章

  1. 关于计算机网络技术多用复路,自考计算机网络技术练习题
  2. Linux看硬盘同步,从磁盘同步看linux的机制和策略
  3. ethercat如何编程 台达50mc_台达可编程控制器DVP-50MC系列产品介绍
  4. linux安装qq_一分钟,轻松上手 Linux 安装QQ,让你简单开启聊天办公新环境
  5. vba两个集合的差集_Python中的集合是如何使用的?
  6. Django项目:CMDB(服务器硬件资产自动采集系统)--11--07CMDB文件模式测试采集硬件数据...
  7. Binary Tree Zigzag Level Order Traversal
  8. RN和React路由详解及对比
  9. 【零基础学Java】—finally代码块(四十七)
  10. r语言调用python_python如何调用R