PL/SQL问题 查询出一段时间里最新的记录

时间:2023-01-08 19:16:12
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个用户,存款值有的可能每天都在变化也有的几天变化一次。

24 个解决方案

#1


数据库设计的有问题,应该把操作记录与结果查询分开

#2


觉得楼上的有理啊,这个通过表结构是很容易实现的

#3


我是在已有的系统数据库里查东西,表结构是不能变的。

存款的每次变化都是产生一条新的记录,
现在的问题是怎么查询出所有人的最后一次变动后的记录。

#4


顶起来,高手快来帮下忙呀

#5


把你的这个表结构贴出来,你描述的是一个分析情况,
没有数据表结构,别人怎么能帮你呢?

#6


例子中的7。23中是否有张三,王五的记录啊?记录是怎么改变的啊?

#7


不好意思,可能是我没说清,再说一下:
======================
资金变动表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

**********************************
望高手帮忙,谢了先。

#8


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

#9


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

#10


--创建测试环境
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

#11


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 < 给定日期

#12


因为存在相同日期同一个人会出现多条记录的情况,因此你的表因该有一个递增的主键列

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

#13


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

#14


您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
http://www.bestdba.cn/match_discussion.aspx

在那里,进入本次评选终选的30位数据库工程师将与您展开积极的互动。他们会为您的问题提供满意的答案,

此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。

您的帖子位于:
http://www.bestdba.cn/match_discussion3.aspx?pointid=570&pointid2=1&pointid3=5&pcount=stc
非常感谢您对本次活动的支持!

#15


如果有个最近操作时间的字段就简单了~

#16


谢谢朋友们,尤其是vivianfdlpw() 老兄
----------------------------------------

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

#17


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

#18


该回复被版主删除

#19


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
)

#20


少了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'

#21


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

#22


该回复被版主删除

#23


我觉得vivianfdlpw() 的效率高点。

楼主可以用set servertime on看看哪个效率高。

#24


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

#1


数据库设计的有问题,应该把操作记录与结果查询分开

#2


觉得楼上的有理啊,这个通过表结构是很容易实现的

#3


我是在已有的系统数据库里查东西,表结构是不能变的。

存款的每次变化都是产生一条新的记录,
现在的问题是怎么查询出所有人的最后一次变动后的记录。

#4


顶起来,高手快来帮下忙呀

#5


把你的这个表结构贴出来,你描述的是一个分析情况,
没有数据表结构,别人怎么能帮你呢?

#6


例子中的7。23中是否有张三,王五的记录啊?记录是怎么改变的啊?

#7


不好意思,可能是我没说清,再说一下:
======================
资金变动表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

**********************************
望高手帮忙,谢了先。

#8


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

#9


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

#10


--创建测试环境
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

#11


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 < 给定日期

#12


因为存在相同日期同一个人会出现多条记录的情况,因此你的表因该有一个递增的主键列

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

#13


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

#14


您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
http://www.bestdba.cn/match_discussion.aspx

在那里,进入本次评选终选的30位数据库工程师将与您展开积极的互动。他们会为您的问题提供满意的答案,

此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。

您的帖子位于:
http://www.bestdba.cn/match_discussion3.aspx?pointid=570&pointid2=1&pointid3=5&pcount=stc
非常感谢您对本次活动的支持!

#15


如果有个最近操作时间的字段就简单了~

#16


谢谢朋友们,尤其是vivianfdlpw() 老兄
----------------------------------------

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

#17


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

#18


该回复被版主删除

#19


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
)

#20


少了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'

#21


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

#22


该回复被版主删除

#23


我觉得vivianfdlpw() 的效率高点。

楼主可以用set servertime on看看哪个效率高。

#24


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