ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 739|回复: 11

这个需求如何利用OVER()开窗函数来解决?

[复制链接]
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
发表于 2017-12-4 10:20 | 显示全部楼层 |阅读模式
先创建了如下的一个表:
create table  demond_201730(
num1 number(3,0),
num2 number(3,0));
insert into   demond_201730 values(1,100);
insert into demond_201730 values(2,80);
insert into  demond_201730 values(3,110);
insert into  demond_201730 values(4,120);
insert into   demond_201730 values(5,70);
insert into  demond_201730 values(6,140);
insert into  demond_201730 values(7,150);
insert into   demond_201730 values(8,160);
问题:如何用Over()开窗函数使得查询资料如下:
num1             num2
1                    100
3                    110
4                    120
6                    140
7                    150
8                    160


论坛徽章:
304
奥迪
日期:2013-07-29 13:45:59红旗
日期:2014-02-07 10:47:20路虎
日期:2014-02-13 10:34:03保时捷
日期:2014-02-14 09:46:462014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14
发表于 2017-12-4 13:25 | 显示全部楼层
select a.*, row_number() over(order by num1) from demond_201730 where num2>=100;

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
 楼主| 发表于 2017-12-4 14:39 | 显示全部楼层
ZALBB 发表于 2017-12-4 13:25
select a.*, row_number() over(order by num1) from demond_201730 where num2>=100;

先说一声谢谢先,我还有一个小问题
这里指定了num2>=100,假如我并不知道 第一行的num2的值:我采取下面做法:
select * from (select a.* ,row_number() over(order by num1)mm from demond_201730 a) T
where num2>=(select num2 from (select num1,num2,row_number()over( order by num1) mm from demond_201730) where mm=1) ;

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
 楼主| 发表于 2017-12-4 14:40 | 显示全部楼层
wa47750033 发表于 2017-12-4 14:39
先说一声谢谢先,我还有一个小问题
这里指定了num2>=100,假如我并不知道 第一行的num2的值:我采取下面 ...

这样子是否有些繁琐,假如我用WITH AS 应该会看起来清晰很多,我还没从优化角度去看待这个问题。

使用道具 举报

回复
论坛徽章:
304
奥迪
日期:2013-07-29 13:45:59红旗
日期:2014-02-07 10:47:20路虎
日期:2014-02-13 10:34:03保时捷
日期:2014-02-14 09:46:462014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14
发表于 2017-12-4 14:47 | 显示全部楼层
wa47750033 发表于 2017-12-4 14:39
先说一声谢谢先,我还有一个小问题
这里指定了num2>=100,假如我并不知道 第一行的num2的值:我采取下面 ...

我是看到你在一楼时,取的NUM2都是大于等于100,所以才加的条件,并非因为第1行,

若要大于等于第一行的记录,其实并不要这么麻烦,

select * from demaod_201730 where num2>=
(select * from (select num2 from demaod_201730 order by num1) where rownum =1)

使用道具 举报

回复
论坛徽章:
304
奥迪
日期:2013-07-29 13:45:59红旗
日期:2014-02-07 10:47:20路虎
日期:2014-02-13 10:34:03保时捷
日期:2014-02-14 09:46:462014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14
发表于 2017-12-4 14:47 | 显示全部楼层
我觉得你没有说明你的需求,

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
 楼主| 发表于 2017-12-4 15:06 | 显示全部楼层
ZALBB 发表于 2017-12-4 14:47
我觉得你没有说明你的需求,

是的,我忽然发现我问题描述的不对,现在略作修改:
表Demond_201730 原本数据如下:
num1         num2
1        100
2        80
3        110
4        120
5        70
6        140
7        150
8        160
9        155---注意这里
10        170
问题:如何用Over()开窗函数使得查询资料
如下:          
num1 num2             
1         100             
3         110             
4         120             
6         140             
7         150            
8         160
10        170
---这里第九行没有被选择。

使用道具 举报

回复
论坛徽章:
304
奥迪
日期:2013-07-29 13:45:59红旗
日期:2014-02-07 10:47:20路虎
日期:2014-02-13 10:34:03保时捷
日期:2014-02-14 09:46:462014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14
发表于 2017-12-4 15:10 | 显示全部楼层
wa47750033 发表于 2017-12-4 15:06
是的,我忽然发现我问题描述的不对,现在略作修改:
表Demond_201730 原本数据如下:
num1         nu ...

哪有这样描述问题的,你得说明共性,而不是具体不取哪一条数据,比如;为何不取第2,5,9条,他们有什么特点?

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
 楼主| 发表于 2017-12-4 15:25 | 显示全部楼层
ZALBB 发表于 2017-12-4 15:10
哪有这样描述问题的,你得说明共性,而不是具体不取哪一条数据,比如;为何不取第2,5,9条,他们有什么特 ...

提问果然是一门艺术,好,Thanks you ponit out,我整理了一下词汇,厚着脸再试一次。
表Demond_201730 原本数据如下:
Num1 代表年份,num2 代表销量
num1   num2
1        100
2        80
3        110
4        120
5        70
6        140
7        150
8        160
9        155---注意这里
10        170
问题:
如何用Over()开窗函数选出---只有当月的销量大于以往销量的月份所对应的资料
结果应当如下:           
num1 num2            
1         100            
3         110            
4         120            
6         140            
7         150            
8         160
10        170
---这里第num1=9对应的行没有被选择。

使用道具 举报

回复
认证徽章
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29鲜花蛋
日期:2011-12-20 16:06:45娜美
日期:2017-12-15 13:56:33技术图书徽章
日期:2017-11-17 09:13:02妮可·罗宾
日期:2017-11-17 10:43:23
发表于 2017-12-4 15:46 | 显示全部楼层
SELECT num1, num2 FROM
(SELECT a.*,NVL(MAX(num2)OVER (ORDER BY num1 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING),0) num FROM demond_201730 a)
WHERE num2 > num;

參考之前帖子:http://www.itpub.net/thread-2094803-1-1.html

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表