一个sql开发问题

[复制链接]
查看11 | 回复9 | 2011-11-1 16:24:51 | 显示全部楼层 |阅读模式
一个表结构如下:
id date
sj
cs
zz
d_id
12013-03-01 10.9
2
100
1
22013-03-02 10.8
2
100
1
32013-03-03 10.7
2
100
1
42013-03-04 11.2
2
100
1
52013-03-01 20.9
2
80
2
62013-03-02 20.8
2
80
2
72013-03-03 30.7
3
90
2
82013-03-04 30.2
3
90
2

如上:
d_id是一个档案标识,sj应该随时间的变化减小或不变,除非在cs和zz一起变大时,sj会随zz增加的部分相应增加一定数值;
现在异常数据id=4时,sj变大,但不满足cs和zz变大这个条件,现在需要写语句把id=4的这种情况找出来,不知道有何好的办法没有,数据量比较大,一个月的数据需要比较,大约每天300w行记录,300w*30,数据量很大!谢谢

回复

使用道具 举报

千问 | 2011-11-1 16:24:51 | 显示全部楼层
cursor
回复

使用道具 举报

千问 | 2011-11-1 16:24:51 | 显示全部楼层
用分析函数LAG(....) OVER(ORDER BY ....)取到上一条的cs和zz, 然后和当前的作比较。
回复

使用道具 举报

千问 | 2011-11-1 16:24:51 | 显示全部楼层
newkid 发表于 2013-3-18 23:58
用分析函数LAG(....) OVER(ORDER BY ....)取到上一条的cs和zz, 然后和当前的作比较。

3Q,今天又分析了一下实际情况,没有办法一句话出结果,还是安心的写遍历了,其中难点在部分记录是空行上
回复

使用道具 举报

千问 | 2011-11-1 16:24:51 | 显示全部楼层
select d_id ,time-nm,cs,sj, from
(select d_id,to_number(to_char(date,'yyyymmdd')) time,cs,sj rownum as nm from table
order by sj desc );
想利用序列和时间的关系,计算比较;
业务特性,在cs和zz没有增加的情况下,sj应该按照时间的增加变小的,如果不存在空值的情况下,跨月时处理下,语句可以写出来的,但实际情况比较复杂,还是按部就班的写遍历比较了
回复

使用道具 举报

千问 | 2011-11-1 16:24:51 | 显示全部楼层
zyqjason 发表于 2013-3-19 23:32
select d_id ,time-nm,cs,sj, from
(select d_id,to_number(to_char(date,'yyyymmdd')) time,cs,sj rownum ...

为什么碰到空值就不行?空值的比较规则是什么?
游标能做到的,分析函数往往也能做到。
回复

使用道具 举报

千问 | 2011-11-1 16:24:51 | 显示全部楼层
我就是过来学习的……
回复

使用道具 举报

千问 | 2011-11-1 16:24:51 | 显示全部楼层
dlsonic 发表于 2013-3-20 08:11
我就是过来学习的……

俺也是过来看看的
回复

使用道具 举报

千问 | 2011-11-1 16:24:51 | 显示全部楼层
需求描述不是很清楚,可能会有误解,
问题1. ID是不是按时间升序排序(即ID越小,表示这条记录的时间越早),如果不是的话,“sj应该随时间的变化减小或不变”这一点如果判别?
问题2. 如果以上第1点的ID是按时间升序排序,那么ID in (4,5,6,7,8)的记录都会被找出来,如果你只是想找出ID 为4的记录,那是不是应该以d_id分组,每一组内去这样查找?
如果以上第1点和第2点都成立,那么以下代码可以找出ID=4的记录,
select *
from tab_temp a
whereexists (select null

fromtab_temp b

where b.id < a.id

and b.d_id = a.d_id

and b.sj < a.sj

and not (b.cs < a.cs

and b.zz < a.zz));


回复

使用道具 举报

千问 | 2011-11-1 16:24:51 | 显示全部楼层
haolin_niba 发表于 2013-3-20 17:25
需求描述不是很清楚,可能会有误解,
问题1. ID是不是按时间升序排序(即ID越小,表示这条记录的时间越早 ...

1、id只是序列,理论是随时间变化的,但顺序可能不准,序列问题;
2、是应该在一个组内查找;
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行