日期:2014-05-17  浏览次数:20793 次

请问一个sql语句:如何实现“连续”这个概念?
我现在有如下的一个表a,
columnA(字符型)   columnB(日期型)   ColumnC(数字型)
a                                   2007-01-01                 15.00
b                                   2007-02-02                 20.00
c                                   2007-03-03                 30.00
d                                   2007-04-04                   -25.10
f                                   2002-01-01                   -33.00
……

其中columnB就是每个月只有一个值,如2006年2月,存储的值就是2006-02-02,2007年11月,存储的值就是2007-11-11

这个表很大而且无序,现在我想找出这样的值:ColumnA连续4个月ColumnC的值为负的记录,请问有没有直接的函数可以用呢?又不能写存储过程。。


------解决方案--------------------
SQL> select * from a;

COLUMNA COLUMNB COLUMNC
-------------------- ---------- ----------
a 01-1月 -07 15
a 02-2月 -07 35
a 03-3月 -07 -15
a 04-4月 -07 -25
a 05-5月 -07 -30
a 06-6月 -07 -30
a 07-7月 -07 -40
a 08-8月 -07 -50
a 09-9月 -07 100
b 01-1月 -07 10
b 02-2月 -07 -20

COLUMNA COLUMNB COLUMNC
-------------------- ---------- ----------
b 03-3月 -07 20
b 04-4月 -07 -30
b 05-5月 -07 30
b 06-6月 -07 -40
b 07-7月 -07 -50
b 08-8月 -07 50
b 09-9月 -07 -60

已选择18行。

select columnA,min(to_char(columnB, 'yyyy-mm-dd ')) minB,
max(to_char(columnB, 'yyyy-mm-dd ')) maxB from
(select columnA,columnB,
add_months(trunc(columnB, 'mm '),1-rank() over(partition by columnA order by columnB)) rcb
from (select distinct columnA, trunc(columnB) columnB from a
where columnC <0 order by columnB))
group by columnA,rcb
having count(*) > = 4
/

COLUMNA MINB MAXB
-------------------- -------------------- --------------------
a 2007-03-03 2007-08-08


从CSDN一个帖子学来的,不敢藏私,与大家分享。
解释:首先将所有C为负的列选择出来。利用分析函数rank()给所有columnA相同的列
按columnB排序后给予一定的序号。该序号是连续的。
利用add_months减去对应的序号(还要+1,为什么自己想),这样如果C为负的B是连续
的话,那么减去连续的序号后,必然是相同的数据X,如果不连续得出的X也不相同。
例如
a b b-a
1 10 9
2 11 9
3 14 11
4 15 11
5 16 11
6 17 11
7 18 11
8 20 12
9 21 12
然后利用分组,判断相同A相同X超过4次以上为连续4个月为负数的值。