表结构如下所示:标识码,项目名称,面积,金额,项目状态,上报时间,历史标识码guid, xm_mc, mj, je, xm_zt, sb_sj, old_guid
/ 项目状态 1:待报 2 上报,3 变更,/ guid 为自动生成的标志码a.当执行上报操作,新增一条数据,xm_zt 为 1,上报时间改成 当前操作时间b.当执行变更操作时候,现在的记录 xm_zt 改成 3,复制一条记录,xm_zt=1,sb_sj 清空
目前查询的需求,需获取某一个时点的最新数据,数据量大概300万级别,怎么写SQL 语句,才能得到最
佳性能的查询结果
如:'1','项目1',5,5000,2,2010-10-21,'''2','项目2',3.4,4200,2,2011-12-05,'''3','项目3',8.6,12000,2,2012-3-21,''对项目2做了一次变更后再上报'1','项目1',5,5000,2,2010-10-21,'''2','项目2',3.4,4200,3,2011-12-05,'''3','项目3',8.6,12000,2,2012-3-21,'''5','项目2',3.4,4200,3,2012-3-27,'2'
想要的结果 如果时间点 截止到 2012-3-21的结果 (guid=2 取老的)'1','项目1',5,5000,2,2010-10-21,'''2','项目2',3.4,4200,3,2011-12-05,'''3','项目3',8.6,12000,2,2012-3-21,''如果时间点  截止到 2012-3-27 的结果 (guid=2 取新的)'1','项目1',5,5000,2,2010-10-21,'''3','项目3',8.6,12000,2,2012-3-21,'''5','项目2',3.4,4200,3,2012-3-27,'2'
有可能进行多次变更,不管怎么只取时间点范围内最后一条的

解决方案 »

  1.   


    create table t(
    guid varchar2(10), xm_mc varchar2(10), mj number, je number, xm_zt int, sb_sj date, old_guid varchar2(10)
    );insert into t values ('1','项目1',5,5000,2,date '2010-10-21',null  );
    insert into t values ('2','项目2',3.4,4200,3,date '2011-12-05',null);
    insert into t values ('3','项目3',8.6,12000,2,date '2012-3-21',null);
    insert into t values ('5','项目2',3.4,4200,3,date '2012-3-27','2');
    insert into t values ('6','项目2',3.4,4200,3,date '2012-3-27','5');
    insert into t values ('7','项目2',3.4,4200,3,date '2012-3-27','6');
    select *
      from t
     where guid not in (select old_guid from t where old_guid is not null);上面的查询应该是你要的。其实就是过滤掉所有发生过变更的(即出现在old_guid列中的)记录