问题描述
嗨,我正在做一个项目,我需要一些查询方面的帮助。
我在现有表中有以下数据:
我需要首先从S_DATE列表中找到最小日期,该列表位于S_DATE的最后2年时间范围内。所以我使用子选择查询给我的数据:
例如,第4行的S_DATE为15年3月28日,该行的2年时间范围是从2013年3月28日 (S_DATE2) 到15年3月28日 (S_DATE)。我需要从S_DATE列表中找到最小日期-这是28-APR-14 (FIRST_DATE) -> 换句话说: 28-APR-14是我可以从列表中找到的最小日期,该列表在28-MAR-13和28-MAR-15之间。
然后我需要做的下一件事是从S_DATE列表中找到最小日期,这是在过去3年的时间范围内。我必须使用另一个子查询来获取日期:
对于相同的示例,第4行。3年的时间范围是从28 APR-11 (FIRST_DATE3) 到28 APR-14 (FIRST_DATE),S_DATE列表中的最小日期是01 FEB-12。
下面是这个例子的我的代码:
这只是一个简单的例子,所以我没有任何问题与子选择查询。但我的真实数据集包含超过60,000行。对于每个S_ID,我有成千上万的日期来进行这些逻辑检查。子查询的查询运行速度非常慢。我是SQL新手,在网上没有找到任何有用的建议。所以请帮我这个!我真的很感激你的时间和努力!
我想知道还有其他方法可以得到相同的结果吗?如果我使用视图或存储过程,会有所帮助吗?
谢谢!
我在现有表中有以下数据:
----------------- S_ID S_DATE ----------------- A 01-FEB-12 A 14-MAR-12 A 28-APR-14 A 28-MAR-15 A 28-AUG-18复制
我需要首先从S_DATE列表中找到最小日期,该列表位于S_DATE的最后2年时间范围内。所以我使用子选择查询给我的数据:
例如,第4行的S_DATE为15年3月28日,该行的2年时间范围是从2013年3月28日 (S_DATE2) 到15年3月28日 (S_DATE)。我需要从S_DATE列表中找到最小日期-这是28-APR-14 (FIRST_DATE) -> 换句话说: 28-APR-14是我可以从列表中找到的最小日期,该列表在28-MAR-13和28-MAR-15之间。
-------------------------------------------------- S_ID S_DATE S_DATE2 FIRST_DATE -------------------------------------------------- A 01-FEB-12 01-FEB-10 01-FEB-12 A 14-MAR-12 14-MAR-10 01-FEB-12 A 28-APR-14 28-APR-12 28-APR-14 A 28-MAR-15 28-MAR-13 28-APR-14 A 28-AUG-18 28-AUG-16 28-AUG-18复制
然后我需要做的下一件事是从S_DATE列表中找到最小日期,这是在过去3年的时间范围内。我必须使用另一个子查询来获取日期:
对于相同的示例,第4行。3年的时间范围是从28 APR-11 (FIRST_DATE3) 到28 APR-14 (FIRST_DATE),S_DATE列表中的最小日期是01 FEB-12。
-------------------------------------------------------------------------------------- S_ID S_DATE S_DATE2 FIRST_DATE FIRST_DATE3 FIRST_DATE_IN3 -------------------------------------------------------------------------------------- A 01-FEB-12 01-FEB-10 01-FEB-12 01-FEB-09 01-FEB-12 A 14-MAR-12 14-MAR-10 01-FEB-12 01-FEB-09 01-FEB-12 A 28-APR-14 28-APR-12 28-APR-14 28-APR-11 01-FEB-12 A 28-MAR-15 28-MAR-13 28-APR-14 28-APR-11 01-FEB-12 A 28-AUG-18 28-AUG-16 28-AUG-18 28-AUG-15 28-AUG-18复制
下面是这个例子的我的代码:
SELECT Q.*, ADD_MONTHS(Q.FIRST_DATE,-12*3) AS FIRST_DATE3, ( SELECT MIN(S1.S_DATE) FROM SAMPLE_TEST S1 WHERE S1.S_ID=Q.S_ID AND S1.S_DATE>=ADD_MONTHS(Q.FIRST_DATE,-12*3) AND S1.S_DATE<=Q.FIRST_DATE ) AS FIRST_DATE_IN3 FROM( SELECT S.S_ID, S.S_DATE, ADD_MONTHS(S.S_DATE,-12*2) AS S_DATE2, ( SELECT MIN(S1.S_DATE) FROM SAMPLE_TEST S1 WHERE S1.S_ID=S.S_ID AND S1.S_DATE>=ADD_MONTHS(S.S_DATE,-12*2) AND S1.S_DATE<=S.S_DATE ) AS FIRST_DATE FROM SAMPLE_TEST S )Q ORDER BY Q.S_DATE复制
这只是一个简单的例子,所以我没有任何问题与子选择查询。但我的真实数据集包含超过60,000行。对于每个S_ID,我有成千上万的日期来进行这些逻辑检查。子查询的查询运行速度非常慢。我是SQL新手,在网上没有找到任何有用的建议。所以请帮我这个!我真的很感激你的时间和努力!
我想知道还有其他方法可以得到相同的结果吗?如果我使用视图或存储过程,会有所帮助吗?
谢谢!
专家解答
因此,您想在与当前行的时间范围偏移量内的数据中找到最小日期?
如果是这样,则不需要子查询。解析函数就是答案!
在min() 之后添加over子句,并按日期排序。
然后将window子句设置为
这将把日期N在当前之前的所有行传递给min。其中最早发现:
如果是这样,则不需要子查询。解析函数就是答案!
在min() 之后添加over子句,并按日期排序。
然后将window子句设置为
range between N preceding and current row复制
这将把日期N在当前之前的所有行传递给min。其中最早发现:
create table sample_test ( s_id varchar(10), s_date date ); insert into sample_test values ('A', to_date('01-feb-2012','dd-mon-yyyy')); insert into sample_test values ('A', to_date('14-mar-2012','dd-mon-yyyy')); insert into sample_test values ('A', to_date('28-mar-2015','dd-mon-yyyy')); insert into sample_test values ('A', to_date('28-aug-2018','dd-mon-yyyy')); commit; select s_date, min ( s_date ) over ( order by s_date range between ( s_date - add_months ( s_date, -24 ) ) preceding and current row ) min_2_year , min ( s_date ) over ( order by s_date range between ( s_date - add_months ( s_date, -36 ) ) preceding and current row ) min_3_year from sample_test; S_DATE MIN_2_YEAR MIN_3_YEAR 01-FEB-2012 00:00:00 01-FEB-2012 00:00:00 01-FEB-2012 00:00:00 14-MAR-2012 00:00:00 01-FEB-2012 00:00:00 01-FEB-2012 00:00:00 28-MAR-2015 00:00:00 28-MAR-2015 00:00:00 28-MAR-2015 00:00:00 28-AUG-2018 00:00:00 28-AUG-2018 00:00:00 28-AUG-2018 00:00:00复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
599次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
582次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
494次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
476次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
462次阅读
2025-04-22 00:20:37
Oracle 19c RAC更换IP实战,运维必看!
szrsu
439次阅读
2025-04-08 23:57:08
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
437次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
425次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
369次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
360次阅读
2025-04-15 14:48:05