题目:如下表
该表以拉链的方式存储账户的余额信息,请以2012-8-7日为数据日期,计算从2012-8-1日到2012-8-7各账号的积数,【应该说明哪个日期是开区间,那个日期是闭区间】
建表语句:
eg: 字段名如下
create table t03_acct_bal_h(
Acct_no bigint comment '账号id',
Current_bal bigint COMMENT '当前余额',
Org_name string COMMENT '所属机构',
Start_dt string COMMENT '开始日期',
End_dt string COMMENT '结束日期'
)
row format delimited fields terminated by '\t';
插入数据如下:
9000000001 100 杭州分行 20120101 20120304
9000000001 200 杭州分行 20120304 20120606
9000000001 300 杭州分行 20120606 20120608
9000000001 400 杭州分行 20120608 30001231
9000000002 500 宁波分行 20120101 20120112
9000000002 900 宁波分行 20120112 30001231
9000000003 100 上海分行 20120101 30001231
题目说明:30001231:该日期最大日期,表示账号余额至今一直未变动,且为最新余额。
积分概念:积数指的是在银行的账户内存款余额*存款天数。例如a客户的账号在8月1日余额为100,8月4日余额为200,截止8月6日余额为100。至8月7日的积数为:100*3+200*2+100*2
思路:要先把8.1号之前的积分清算出来,8.1号到8.7号的数值是不变的。用8.1号的积分,乘以8.7号到8.1号总共天数即可。
代码实现:
with chazhi02 as(
select *,
datediff(
case when
from_unixtime(unix_timestamp(End_dt,'yyyyMMdd')
,'yyyy-MM-dd')='3000-12-31'
then '2012-08-01'
else
from_unixtime(unix_timestamp(End_dt,'yyyyMMdd')
,'yyyy-MM-dd')
end,
from_unixtime(
unix_timestamp(Start_dt,'yyyyMMdd')
,'yyyy-MM-dd')
) as cha from t03_acct_bal_h
)
select Acct_no,sum((current_bal*cha)*
datediff('2012-08-07','2012-08-01')
) as riqi from chazhi02 group by Acct_no;
总结:重点是时间的转换,
1、from_unixtime 是转换时间类型,进行格式化
2、unix_timestamp 是对时间进行时间戳的转换
3、datediff 是两个时间相减
银行--根据日期算出固定时间积分
最新推荐文章于 2025-04-25 23:43:23 发布