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

数据表是一张财务流水报告表,表明为 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;