博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL 分组(分区)排序获取第一条数据 ROW_NUMBER() OVER() PARTITION BY的使用
阅读量:4961 次
发布时间:2019-06-12

本文共 1054 字,大约阅读时间需要 3 分钟。

将最近用到的一些sql 记录下来

首先来看下应用场景:

有一张价格 “订单价格设置” 表如下:

商品编号,价格设置时间id(类似于创建时间,创建时间约早,则act_id越小) ,价格的时间段,商品价格

 

现在要求选出每个商品价格最大,价格设置时间id最大的那条记录,要求先考虑价格,再考虑设置时间 

理想的结果:取出的是第3条记录 和第5条记录

思路:将数据根据item分区,再在每个分区中进行排序,先根据价格排序,再根据设置时间id排序,最后取出每个分组的第一条记录

实现:

利用 ROW_NUMBER() OVER(),PARTITION BY,ORDER BY

先直接上代码:

select item,act_id,loc_id,start_date,end_date,price, ROW_NUMBER() over( partition by item order by price desc,act_id desc) as new_index from test1

查询结果如下

 

可以看到查询出的结果已经进行了分区和进行了一次排序,并且增加了排序标记new_index

接下来只需从结果中查出new_index = 1的记录即为我们想要的结果:

select * from(select item,act_id,loc_id,start_date,end_date,price, ROW_NUMBER() over( partition by item order by price desc,act_id desc) as new_index from test1)b where b.new_index = 1

结果如下:

 

分析:什么是ROW_NUMBER() OVER()和 PARTITION BY

① ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,

在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

② PARTITION BY 分区函数可以根据某字段分区并返回所有结果集,作为分区函数一般与Row_Number() over()排序一起连用,可实现分区排序的功能

它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。

 

转载于:https://www.cnblogs.com/ygtup/p/9557794.html

你可能感兴趣的文章
JWT
查看>>
2019西北工业大学程序设计创新实践基地春季选拔赛 I Chino with Rewrite (并查集+树链剖分+线段树)...
查看>>
爬虫代理的设置
查看>>
SQL基础操作
查看>>
Ajax总结
查看>>
adobe form
查看>>
Winform使用BackgroundWorker组件进行异步编程
查看>>
Google开放了一套天气预报API,还是很好用的
查看>>
php 新闻上一条下一条
查看>>
SparkR初体验2.0
查看>>
AutoCAD .NET开发大师Kean有价值的博客 2006年8月 .NET内容整理
查看>>
Mysql之select查询
查看>>
第八周
查看>>
git命令大全
查看>>
javascript基础加固—-基础
查看>>
团队作业week9 情景测试
查看>>
FineReport——JS监听其他控件事件
查看>>
从Java和JavaScript来学习Haskell和Groovy
查看>>
个人计划表
查看>>
第二次团队工作第六日
查看>>