当前在线人数8947
首页 - 分类讨论区 - 电脑网络 - 数据库版 -阅读文章
未名交友
[更多]
[更多]
文章阅读:webbew SQL问题解法2 -- SQL 利器Recursive CTE
[同主题阅读] [版面: 数据库] [作者:Beijing] , 2013年08月15日11:46:50
Beijing
进入未名形象秀
我的博客
[上篇] [下篇] [同主题上篇] [同主题下篇]

发信人: Beijing (我是猪,听说猪是被祝福的), 信区: Database
标  题: webbew SQL问题解法2 -- SQL 利器Recursive CTE
发信站: BBS 未名空间站 (Thu Aug 15 11:46:50 2013, 美东)

***既然是授渔,那就没有鱼,要鱼的请绕行.***

首先,这类复杂sql问题,建议大家用CTE(和Recursive无关),每一步都分开,思路会
清晰得多
with t1 as(
select ....
from ....),
t2 as (
select...
from t1, .....),
....
select
from tn

用过oracle connect by的同学,Recursive CTE实现了类似功能,而且是ansi的,推荐
大家使用,当然,本题用connect by也可以

对于解决本题,思路和用Analytic Functions类似,就是要达到排序后分组的目的,以
原题数据为例,如果有以下标记,用group by user,标记值可得到min(startdate),
max(enddate)即可

User StartDate EndDate 标记值
1 12/2/2011 1/16/2012 0
1 3/4/2012 3/24/2012 1
1 4/5/2012 4/26/2012 1
1 5/14/2012 6/7/2012 1
2 3/5/2012 7/30/2012 0
2 8/4/2012 9/15/2012 0
3 6/5/2012 8/20/2012 0

先看一下原理
http://www.nocoug.org/download/2010-05/2010_303_Fernandez_ppt.pdf
http://www.morganslibrary.org/reference/with.html
http://technet.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx

问题就来了,我们的起始的SQL应该是什么呢?我们的recursive应该怎么连呢?很显然
我们的起始SQL应该是每个user最早的startdate记录,下面记录就应该是一个一个按
startdate的升序排列。我们原始table没有这个序列数据,所以我们要给它加上,结果
假设是t1(use CTE!!)
select *, row_number() over (partition by user  order by startdate) rn
from table

有了t1,我们上面的2个问题都解决了。起始sql就是select *, rn from t1 where rn=
1,连接就是靠user=user and rn=rn+1。排序连接解决了,但是我们的分组问题还没有
解决,也就是我们的标记ind的值还没有解决。在我们的Recursive CTE加入ind,起始
sql里面ind的值假定是0(select *, rn, 0 ind from t1 where rn=1, 任何值都行)
。我们是否能使ind值达到上面例子里分组的目的呢。答案是肯定的,每一个record,
如果和前面比没超过30天,这个record的ind就沿用上一个record的ind;如果超过30天
,就在上一个的基础上+1。这样问题就解决了。




--
1. 本人言论仅供参考
--2. 听不得人说Vivian Chow长得不美
--3. 如果不想被爱所伤,就永远不要去爱
--4. 一定要找个能养我的PPMM
5. 成功=命中注定
6. 活着就是幸福

※ 修改:·Beijing 於 Aug 15 14:31:00 2013 修改本文·[FROM: 12.]
※ 来源:·WWW 未名空间站 海外: mitbbs.com 中国: mitbbs.cn·[FROM: 12.]

[上篇] [下篇] [同主题上篇] [同主题下篇]
[转寄] [转贴] [回信给作者] [修改文章] [删除文章] [同主题阅读] [从此处展开] [返回版面] [快速返回] [收藏] [举报]
 
回复文章
标题:
内 容:

未名交友
将您的链接放在这儿

友情链接


 

Site Map - Contact Us - Terms and Conditions - Privacy Policy

版权所有,未名空间(mitbbs.com),since 1996