比如一个存款记录表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
**********************************
望高手帮忙,谢了先。
======================
资金变动表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
)
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
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 < 给定日期
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
)
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
非常感谢您对本次活动的支持!
您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
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兄台,不知道这样的主键怎么写代码,请再指点一下。
----------------------------------------
需要说明的是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
,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
)
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'
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看看哪个效率高。
楼主可以用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
**********************************
望高手帮忙,谢了先。
======================
资金变动表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
)
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
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 < 给定日期
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
)
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
非常感谢您对本次活动的支持!
您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
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兄台,不知道这样的主键怎么写代码,请再指点一下。
----------------------------------------
需要说明的是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
,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
)
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'
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看看哪个效率高。
楼主可以用set servertime on看看哪个效率高。
#24
刚好是有点俺需要的HOHO 保存了先