一个简单的数据量很大的表查询最新数据的sql思路

现在碰到过这样一个问题:

数据表是一张财务流水报告表,表明为 qtty_sheet ,数据量比较大,而且历史不同的报表日期的项目对应的金额数值可能会发生变化,这张表市增量更新的,需要将数据表中的最新数据拿出来进行展示,数据表的数据样式如图:

主键idproj_name(项目名称)value(项目对应的金额)report_dt(报表日期)data_dt(数据日期)
0001营销金额10002021070120210715
0001贷款金额20002021070120210715
0001抵押贷款30002021070120210715
0001营销金额50002021070220210715
0001贷款金额30002021070220210715
0001营销金额15002021070120210716
0001贷款金额25002021070120210716

                      .........

0008营销金额10002021070120210715
0008贷款金额20002021070120210715
0008抵押贷款30002021070120210715
0008营销金额50002021070220210715
0008贷款金额30002021070220210715
0008营销金额15002021070120210716
0008贷款金额25002021070120210716

datd_dt    表示的是每日的增量表的数据的时间日期

report_dt  表示的是报告日期,即报表的日期

value   项目对应的数据值(历史不同项目的数据值value可能会随着业务逻辑的更改而更改,

表中若有几条相同主键id 相同report_dt的数据的话,取的值应该取时间data_dt最大的值)

需求:

找出id=0001的报表日期为20210701的所有不同的项目名称的数据的最新数值:并直接以下面这种数据值展示出来

id营销金额贷款金额抵押贷款report_dt(报表日期)
000115002500300020210701
00015000300020210702
...............
000215002500300020210701
00025000300020210702

先提供几个思路,以后有时间再来继续更新

思路一:

select t.* from 

(select

row_number() over(partition by id,report_dt order by data_dt desc ) as rn,

 *

from qtty_sheet ) t where t.rn=1;

思路二(在mysql中进行更新,假如基础表的数据量特别大,无法完成更新的话,可以先用子查询查询出不同的proj_name对应的数据日期data_dt,然后使用join条件满足限制找出时间最大一条即可):

假如表的数据量太大,在做更新操作的时候,无法完成更新,即无法执行update操作。所以可以使用下面的方法:(可能会损耗一些性能,但是能够把数据更新进到表里面)

1-将增量更新的表的数据直接插入到表里面 (即上面的红色字体部分)

2-查询某个id的项目的数据值的时候,可以这样查询

select 

id,proj_name,report_dt,max(data_dt)    --找出id=0001的各个proj_name最大的data_dt时间字段

from qtty_sheet

group by id,proj_name,report_dt where id='0001' ;

显示结果为:

主键idproj_name(项目名称)report_dt(报表日期)max(data_dt)(数据日期)
0001营销金额2021070120210716
0001营销金额2021070120210716
0001贷款金额2021070120210716
0001贷款金额2021070120210716
0001抵押贷款2021070120210715

select m.* from 

qtty_sheet t join --子查询和原表进行join,将符合条件data_dt相等的数据拿出来就是最新的数据

(select 

id,proj_name,report_dt,max(data_dt)    --找出id=0001的各个proj_name最大的data_dt时间字段

from qtty_sheet

group by id,proj_name,report_dt where id='0001' ) m

on t.id=m.id and t.data_dt=m.data_dt and t.report_dt=m.report_dt;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值