现在碰到过这样一个问题:
数据表是一张财务流水报告表,表明为 qtty_sheet ,数据量比较大,而且历史不同的报表日期的项目对应的金额数值可能会发生变化,这张表市增量更新的,需要将数据表中的最新数据拿出来进行展示,数据表的数据样式如图:
主键id | proj_name(项目名称) | value(项目对应的金额) | report_dt(报表日期) | data_dt(数据日期) |
0001 | 营销金额 | 1000 | 20210701 | 20210715 |
0001 | 贷款金额 | 2000 | 20210701 | 20210715 |
0001 | 抵押贷款 | 3000 | 20210701 | 20210715 |
0001 | 营销金额 | 5000 | 20210702 | 20210715 |
0001 | 贷款金额 | 3000 | 20210702 | 20210715 |
0001 | 营销金额 | 1500 | 20210701 | 20210716 |
0001 | 贷款金额 | 2500 | 20210701 | 20210716 |
.........
0008 | 营销金额 | 1000 | 20210701 | 20210715 |
0008 | 贷款金额 | 2000 | 20210701 | 20210715 |
0008 | 抵押贷款 | 3000 | 20210701 | 20210715 |
0008 | 营销金额 | 5000 | 20210702 | 20210715 |
0008 | 贷款金额 | 3000 | 20210702 | 20210715 |
0008 | 营销金额 | 1500 | 20210701 | 20210716 |
0008 | 贷款金额 | 2500 | 20210701 | 20210716 |
datd_dt 表示的是每日的增量表的数据的时间日期
report_dt 表示的是报告日期,即报表的日期
value 项目对应的数据值(历史不同项目的数据值value可能会随着业务逻辑的更改而更改,
表中若有几条相同主键id 相同report_dt的数据的话,取的值应该取时间data_dt最大的值)
需求:
找出id=0001的报表日期为20210701的所有不同的项目名称的数据的最新数值:并直接以下面这种数据值展示出来
id | 营销金额 | 贷款金额 | 抵押贷款 | report_dt(报表日期) |
0001 | 1500 | 2500 | 3000 | 20210701 |
0001 | 5000 | 3000 | 20210702 | |
... | ... | ... | ... | ... |
0002 | 1500 | 2500 | 3000 | 20210701 |
0002 | 5000 | 3000 | 20210702 |
先提供几个思路,以后有时间再来继续更新
思路一:
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营销金额20210701202107160001营销金额20210701202107160001贷款金额20210701202107160001贷款金额20210701202107160001抵押贷款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;