PL/SQL问题 查询出一段时间里最新的记录比如一个存款记录表A
7.1 张三存款为500  李四为300   王五800
7.8 张三的变成900   王五的变为600  李四的没变
7.23 李四的变成了1600  别人的没变查询结果:
张三900  李四1600  王五 600用SQL查询出7.1~7.30   所有人的最新存款也就是到7.30日的最新存款
注,表里有N个用户,存款值有的可能每天都在变化也有的几天变化一次。

解决方案 »

  1.   

    不好意思,可能是我没说清,再说一下:
    ======================
    资金变动表P
    ----------------------
    Date Name Fund
    6月及以前数据省略
    7.1 张三 500
    7.1 李四 300
    7.1 王五 800
    7.8 张三 900
    7.8 王五 600
    7.23 李四 1600
    8月数据省略
    ======================
    注:Fund为当天的最新资金量。查询出截止到7.23所有人资金的最新数据。查询结果:
    Name Fund
    张三 900
    李四 1600
    王五 600**********************************
    望高手帮忙,谢了先。
      

  2.   

    从数据表中看到fund字段数据是在递增的啊,用max可以吗.
      

  3.   

    select *
    from P t
    where t.rowid=(select max(rowid) 
                     from P 
                        where to_char("Date",'mm')='07' 
                              and
                              Name=t.Name
                  )
      

  4.   

    --创建测试环境
    create table P
    (
      "Date" Date,
      Name varchar2(20),
      Fund number
    )
    --truncate table P
    --插入测试数据
    insert into P
    select to_date('7.1','mm.dd'),'张三', 500 from dual
    union all
    select to_date('7.1','mm.dd'),'李四', 300 from dual
    union all
    select to_date('7.1','mm.dd'),'王五', 800 from dual
    union all
    select to_date('7.8','mm.dd'),'张三', 900 from dual
    union all
    select to_date('7.8','mm.dd'),'张三', 3000 from dual
    union all
    select to_date('7.8','mm.dd'),'王五', 600 from dual
    union all
    select to_date('7.23','mm.dd'),'李四', 1600 from dual
    union all
    select to_date('7.23','mm.dd'),'李四', 100 from dual
    union all
    select to_date('7.23','mm.dd'),'李四', 500 from dual;--测试
    select *
    from P t
    where t.rowid=(select max(rowid) 
                     from P 
                        where to_char("Date",'mm')='07' 
                              and
                              Name=t.Name
                  )--结果
       Date NAME FUND 
       
    1 2006-7-8 张三 3000 
    2 2006-7-8 王五 600 
    3 2006-7-23 李四 500
      

  5.   

    select name,fund from p,(select name,max(date) mx from p group by name) p1
    where p.name=p1.name and p.date=p1.mx and p.date < 给定日期
      

  6.   

    因为存在相同日期同一个人会出现多条记录的情况,因此你的表因该有一个递增的主键列select *
    from P t
    where t.主键=(select max(主键) 
                     from P 
                        where to_char("Date",'mm')='07' 
                              and
                              Name=t.Name
                  )
      

  7.   

    另外rowid不是严格递增的,所以我的第一次的写法是错误的。用主键(序列)来确保递增是可行的
      

  8.   

    您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
    您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
    http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选终选的30位数据库工程师将与您展开积极的互动。他们会为您的问题提供满意的答案,此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
    http://www.bestdba.cn/match_discussion3.aspx?pointid=570&pointid2=1&pointid3=5&pcount=stc
    非常感谢您对本次活动的支持!
      

  9.   

    谢谢朋友们,尤其是vivianfdlpw() 老兄
    ----------------------------------------需要说明的是Fund字段不是递增的,资金变动可能增也可能减。
    还有相同日期同一个人最多只有一条记录或者当天没有记录,
    此表的主键是Date+Name,
    vivianfdlpw兄台,不知道这样的主键怎么写代码,请再指点一下。
      

  10.   

    select t.*
           ,P.Fund
    from
       (
           select max("Date") as "LastDate"
                  ,Name
           from P
           group by Name
       )t
    join P on t.LastDate=P."Date"
              and
              t.Name=P.Name
      

  11.   

    select * from P 
    where (Date,Name) in 
    (
    select max(Date),Name from
    (
    select * from P where Date in (7.1,7.23)
    )
    group by Name
    )
      

  12.   

    少了where条件:
    select t.*
           ,P.Fund
    from
       (
           select max("Date") as "LASTDATE"
                  ,Name
           from P
           group by Name
       )t
    join P on t.LASTDATE=P."Date"
              and
              t.Name=P.Name
    where to_char(t.LASTDATE,'mm')='07'
      

  13.   

    谢谢,vivianfdlpw() 和 feng2(蜀山风云) 两种方法都实现目标了,
    从理论上说这两个哪个效率更高一点,因为软件应用的时候一年的数据有几十万条或更多,
    想选用一个效率更高一点的。
      

  14.   

    我觉得vivianfdlpw() 的效率高点。楼主可以用set servertime on看看哪个效率高。
      

  15.   

    刚好是有点俺需要的HOHO 保存了先