一个Oracle查询问题!

huang_w 2010-03-24 09:44:02
表a

字段如下:

ID number date

其中有下拉列表为条件:3-5 ,6-8,9-12

实现这样的查询,当选择3-5 这个值时,查询number 连续3个月 或者连续4个月 或者连续5个月都大于10

即 number>10 的记录

这里功能类似要查找公司员工连续3个月,或者4个月,或者5个月绩效达标的的记录

比如有如下记录
1(Y),2(Y),3(Y),4(N),5(Y),6(Y),7(Y),8(Y),9(N),10(Y),11(Y),12(Y),13(N)
其中Y 表示达标(即上表的number>10),N 表示未达标
我选择3-5这个条件后的到符合条件的记录结果分组显示如下:
月份 | 连续月数
1,2,3 | 3
5,6,7,8 | 4
10,11,12 | 3


注意6,7,8 不能算另一个连续值,因为它们已经是5,6,7,8里面的连续值

我的表里面时间为 YYYYMM

哎 头大了!高手帮帮忙! 谢谢了



...全文
161 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
huang_w 2010-03-25
  • 打赏
  • 举报
回复
对了 条件不能是死的,因为如果我还想查条件6-8 的时候也能查到
大家也可以写函数实现
huang_w 2010-03-25
  • 打赏
  • 举报
回复
谢谢大家
我表里面的数据对应如下:

1001 , 20 , 200408

1002 , 15 , 200409

1003 , 6 , 200410

...

每个月只有一个记录或者没有记录
现在不用像我上面的行转列了,把符合条件的记录列出就可以



etsilence 2010-03-24
  • 打赏
  • 举报
回复
date和number类型的字段改成了date_1,number_1
etsilence 2010-03-24
  • 打赏
  • 举报
回复
应该是按ID分组的对吧,那么请看下面的答案。

select a.id,a.begin_month||' 到 '||b.end_month as months,b.end_seq as months_num
from (select distinct t1.id,
min(date_1) over(partition by id) as begin_month,
1 as begin_seq
from (select t.*,
rank() over(partition by id order by date_1) as seq
from c t
where t.number_1 > 10) t1) a,

(select distinct t1.id,
max(date_1) over(partition by id) as end_month,
max(seq) over(partition by id) as end_seq
from (select t.*,
rank() over(partition by id order by date_1) as seq
from c t
where t.number_1 > 10) t1) b

where a.id = b.id
and b.end_seq >= 3
and b.end_seq <= 5
and months_between(to_date(b.end_month, 'yyyymm'),
to_date(a.begin_month, 'yyyymm')) =
b.end_seq - a.begin_seq;


至于月份的显示格式,如果一定要按LZ你的格式输出,你自己调整下咯。
Adebayor 2010-03-24
  • 打赏
  • 举报
回复
太麻烦了 帮顶
tangren 2010-03-24
  • 打赏
  • 举报
回复
比如你的数据,是每月都有一条吗,还是可能没有,还是可能多条?
tangren 2010-03-24
  • 打赏
  • 举报
回复
给一个实际一点的数据,和想要的结果
East271536394 2010-03-24
  • 打赏
  • 举报
回复
说清楚一点,没有看明白你的意思。

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧