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

oracle查询中如何剔除多余的行,非重复行
如有这样一个表ttt
times                                       c1       c2
2007-1-30   0:00:01               1.1     2.2
2007-1-30   0:05:12               1.4     4.4
2007-1-30   0:07:01               2.1     3.2
2007-1-30   0:11:06               1.2     2.3
........

times时间间隔无规律,比如查出来一天的记录有2000条,我现在只要其中200条,用做时间曲线,该有什么方法呢,分不够再加的,谢谢



------解决方案--------------------
LZ要作的是曲线图,说的200点
应该指均匀分布的200个时刻
如果某个时刻在表里没有纪录
取附近的纪录

------解决方案--------------------
呵呵

最后应该是改成

mod(r,10)=0
------解决方案--------------------
SELECT (TRUNC(SYSDATE) + period / 2000) AS ptime, sc1, sc2 // 还原成时间格式
FROM
(
SELECT period, SUM(c1) AS sc1, SUM(c2) AS sc2 // 合并求平均值
FROM
(
SELECT TRUNC(((times - TRUNC(SYSDATE)) * 2000)) AS period, c1, c2 FROM tst WHERE times > = TRUNC(SYSDATE) // 分成2000个时段
)
GROUP BY period
)
------解决方案--------------------
仅给出一种思路吧
第一步,先把题目整理下
题目就是有这样一个源记录集sr
times c1 c2
2007-1-30 0:00:01 1.1 2.2 | sr(1)
2007-1-30 0:05:12 1.4 4.4 | sr(2)
2007-1-30 0:07:01 2.1 3.2 | sr(3)
........
2007-1-30 0:11:06 1.2 2.3 | sr(n)
要生成一个从t(0)时间开始,时间间隔为intv,时间点间隔为m的结果记录集dr,也就是:
times c1 c2
t(0) + intv * 0 xx xx | dr(1)
t(0) + intv * 1 xx xx | dr(2)
t(0) + intv * 2 xx xx | dr(3)
........
t(0) + intv * (m - 1) xx xx | dr(m)
第二步,构建临时记录集合tr
为了方便,完全可以假设t(0) < sr(i).times < t(0) + intv * (m - 1)
并且容易知道sr.times无重复字段,因为一个时间点上不可能有2个值。
times rowid pre_sr_times next_sr_times
t(0) null
...
t(0) + intv * (m - 1) null
整个临时记录集是由sr记录集合和dr记录集合按照一定的规则合并而成
规则如下:
1、将sr记录插入tr,使得tr.times=sr.times tr.rowid=sr.rowid,其他字段全部为空
2、将dr记录集(此时只有dr.times字段有值)插入tr,
使得tr.times=t(0) ... t(0)+intv*(m-1),其他字段全部为空
3、tr集合中的记录是按照tr.times字段升序排列的
做完后,tr中所有来自sr集合的记录tr.rowid不为空,来自dr集合的记录tr.rowid为空
第三步,加工tr集合,填充pre_sr_times,next_sr_times
首先填充pre_sr_times,填充步骤如下:
第一步,找出所有这样的tr(i)[i> 1],tr(i)满足(tr(i).rowid=null)&&(tr(i-1).rowid!=null);
将tr(i).pre_sr_times=tr(i-1).times
也就是将所有前置记录来自sr的,并且本身记录来自dr的记录的pre_sr_times
填充上前置记录的times
第二步,找出所有这样的tr(i),满足(tr(i).rowid=null)&&(tr(i).pre_sr_times=null);
将tr(i).pre_sr_times=tr(i-1).pre_sr_times
将所以来自dr的,pre_sr_times字段尚未填充记录的记录
填充上其前置记录的pre_sr_times
然后仿pre_sr_times的步骤填充上next_sr_times
第四步,填充目的结果集合
从tr中取出所有的rowid=null的记录,对于这样的记录tr(i) 1 <=i <=m
当tr(i).pre_sr_times - tr(i).times > = tr(i).next_sr_times - tr(i).times时
tr(i).next_sr_times有效,从sr集合中取出时间为tr(i).next_sr_times的记录填充到dr
当tr(i).pre_sr_times - tr(i).times < tr(i).next_sr_times - tr(i).times时
tr(i).pre_sr_times有效,从sr集合中取出时间为tr(i).pre_sr_times的记录填充到dr
第五步,打完全套,收工了,哈哈