HSql练习题

小的练习,都包含一个知识点:

--试题一:
--如表一所示,请用sql语句统计出各分行下的客户余额排名情况,所统计的结果展现形式为:
--Rank_cd 排名    Org_name  所属分行    Cust_id   客户号       Current_bal  当前余额
--客户余额计算口径:客户所有账户余额的总和(一个客户可能有多个账户)。
--数据输入

Rank_cd      Org_name      Cust_id    	Current_bal
(排名)	   (所属分行)   (客户号)       (当前余额)
	

表一:t03_acct_trade_detail

Cust_id     Acct_no     Org_name       AMT         Txn_Dt      Current_bal
(客户号)	(账户号)	(机构名)    (交易金额)    (交易日期)     (当前余额)		
6000121	9000000001	上海分行	100.00	20120701	20000
6000121	9000000002	宁波分行	200.00	20120701	30000
6000122	9000000003	宁波分行	200.00	20120701	30000
6000122	9000000004	宁波分行	200.00	20120701	30000
6000123	9000000005	宁波分行	200.00	20120701	30000
6000123	9000000006	宁波分行	200.00	20120701	30000
6000123	9000000007	宁波分行	200.00	20120701	30000



create table lianxi.t03_acct_trade_detail
(
    Cust_id     bigint,
    Acct_no     bigint,
    Org_name    string,
    AMT         DOUBLE,
    Txn_Dt      string,
    Current_bal bigint
) row format delimited fields terminated by ',';

truncate table lianxi.t03_acct_trade_detail;


load data local inpath '路径' into table lianxi.t03_acct_trade_detail;


select *
from lianxi.t03_acct_trade_detail;

-- 思路:找出相应的值,然后把想要的数据打印出来,最后再进行分区内排序。 当排序无法和group by同时进行时,可以把数据进行处理,最后做排序。
-- eg: group by 不能和开窗的over一起使用。

select *,rank() over(partition by org_name order by current_bal) rn from(
select org_name,cust_id,
       sum(current_bal) as current_bal
       from lianxi.t03_acct_trade_detail group by cust_id,org_name) as li;
--试题二
-- 表二 t03_card_trade_detail(卡交易明细表),字段分别代表:客户号(Cust_id),卡号(Card_id),所属分行
--(org_name),交易金额(AMT),交易日期(Txn_Dt)。该表记录了客户卡消费的信息。
Cust_id	Card_id	Org_name	AMT	Txn_Dt
6000121	622612010600001	上海分行	100.00	20120101
6000121	622612010600001	上海分行	100.00	20120105
6000121	622612010600002	上海分行	100.00	20120109
6000121	622612010600001	宁波分行	200.00	20120701
6000121	622612010600002	宁波分行	200.00	20120205
6000121	622612010600001	宁波分行	200.00	20120706
6000121	622612010600003	宁波分行	200.00	20120601
6000121	622612010600003	宁波分行	200.00	20120801





drop table lianxi.t04_acct_trade_datail;

create table lianxi.t04_acct_trade_datail(
    Cust_id bigint,
    Card_id bigint,
    Org_name string,
    AMT DOUBLE,
    Txn_Dt string
)row format delimited fields terminated by ',';



load data local inpath '/home/xiaofan/wenjian/to_04.txt' into table lianxi.t04_acct_trade_datail;

-- 请用SQL语句计算一年内,客户每个月的消费总金额,展现形式如下:
--eg:是根据月份分区就根据substr类选择月份日期选择位数判断根据月份分组。再选择相应的数据进行分组

select txn_dt,sum(amt) as AMT,card_id from (
SELECT
card_id,amt,substr(txn_dt,1,6) as txn_dt
from lianxi.t04_acct_trade_datail) as a
 group by txn_dt,card_id;

--练习2,如表三所示,请用SQL技术将表三转换成表四的形状(或者伪代码写出历史拉链表处理思路)
--表三:t03_acctno_bal (账户余额明细表)
Cust_id     Acct_no     Org_name        ATM          Txn_Dt       Current_bal
(客户id)    (账户id)    (所属机构)     (交易金额)    (交易日期)     (当前余额)
6000121	9000000001	上海分行	100.00	20120701	20000
6000121	9000000001	上海分行	100.00	20120701	20000
6000122	9000000002	宁波分行	200.00	20120701	30000



drop table lianxi.t05_acct_trade_detail;

Create table lianxi.t05_acct_trade_detail(
    Cust_id bigint,
    Acct_no bigint,
    Org_name string,
    ATM double,
    Txn_Dt string,
    Current_bal bigint
)row format delimited fields terminated by ',';

truncate table lianxi.t05_acct_trade_detail;

select * from lianxi.t05_acct_trade_detail;

load data local inpath '/home/xiaofan/wenjian/chongfu_sql.txt' into table lianxi.t05_acct_trade_detail;


- 可以去重所有的字段,这样是判断数据里面是否有脏数据,和重复数据。
select distinct cust_id,acct_no,org_name,atm,txn_dt,current_bal from lianxi.t05_acct_trade_detail ;


--通过sql 中insert overwrite 来删除不符合要求的数据。就是脏数据,或者重复数据。

insert overwrite table lianxi.t05_acct_trade_detail
select distinct cust_id,acct_no,org_name,atm,txn_dt,current_bal from lianxi.t05_acct_trade_detail;
--今天重点:
   --1、lead(1,2,3) 里面的三个参数 和over联合使用。  1参数:列名   2参数:读取前面几行的数据    3参数:最后一个空值用什么代替。
   --2、distinct  去除表格中重复的脏数据
   --3、insert overwrite 删除表中不符合要求的数据。就是脏数据,或者重复数据。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值