栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Hive QL解题流程详解五

Hive QL解题流程详解五

第9题

1)有三张表分别为会员表(member)销售表(sale)退货表(regoods)

(1)会员表有字段memberid(会员id,主键)credits(积分);

(2)销售表有字段memberid(会员id,外键)购买金额(MNAccount);

(3)退货表中有字段memberid(会员id,外键)退货金额(RMNAccount)。

2)业务说明

(1)销售表中的销售记录可以是会员购买,也可以是非会员购买。(即销售表中的memberid可以为空);

(2)销售表中的一个会员可以有多条购买记录;

(3)退货表中的退货记录可以是会员,也可是非会员;

(4)一个会员可以有一条或多条退货记录。

查询需求:分组查出销售表中所有会员购买金额,同时分组查出退货表中所有会员的退货金额,把会员id相同的购买金额-退款金额得到的结果更新到会员表中对应会员的积分字段(credits)

数据集

sale
1001    50.3
1002    56.5
1003    235
1001    23.6
1005    56.2
        25.6
        33.5

regoods
1001    20.1
1002    23.6
1001    10.1
        23.5
        10.2
1005    0.8

1)建表

create table member(memberid string,credits double) row format delimited fields terminated by 't';
​
create table sale(memberid string,MNAccount double) row format delimited fields terminated by 't';
​
create table regoods(memberid string,RMNAccount double) row format delimited fields terminated by 't';

2)需求SQL

需求分析:
分组查出销售表中所有会员购买金额,同时分组查出退货表中所有会员的退货金额,把会员id相同的购买金额-退款金额得到的结果更新到会员表中对应会员的积分字段(credits)
​
1.增加新的字段来保存积分
2.利用join...on...方法进行购买和退货的查询
3.通过t1和t2两张表进行on的id相等代表会员id相同
​
insert into table member
select
t1.memberid,
MNAccount - RMNAccount
form
(
select
memberid,
sum(MNAccount) MNAccount
from
sale
where
memberid != ''
group by
memberid
)t1
join
(select
memberid,
sum(RMNAcount) RMNAccount
from
regeoods
where
memberid != ''
group by
memberid
)t2
on
t1.memberid = t2.memberid;
第10题

1.用一条SQL语句查询出每门课都大于80分的学生姓名

数据集:

name   kecheng   fenshu
张三    语文    81
张三    数学    75
李四    语文    76
李四    数学     90
王五    语文    81
王五    数学    100
王五    英语    90

SQL:

--answer1
​
select
distinct
name
from
distinct
name
from
tableName
tab
where
name
not in(
select
distinct
name
from
tableName
where
fenshu<=80
)
​
--answer2
select
name
from
tableName
group by
name
having count
min(fenshu)>80;
  1. 学生表 如下:

自动编号 学号 姓名 课程编号 课程名称 分数

 1     2005001 张三   0001   数学   69
 2     2005002 李四   0001   数学   89
 3     2005001 张三   0001   数学   69

删除除了自动编号不同, 其他都相同的学生冗余信息

delete tableName where 自动编号 not in(select min(自动编号) from tablename group by学号, 姓名, 课程编号, 课程名称, 分数)

3.

一个叫team的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球队,现在四个球队进行比赛,用一条sql语句显示所有可能的比赛组合.

需求: 显示所有可能的比赛组合
select
a.name,
b.name
from
team a,
team b
where
a.name < b.name;

4.面试题:怎么把这样一个 如下数据集

year   month amount
1991   1     1.1
1991   2     1.2
1991   3     1.3
1991   4     1.4
1992   1     2.1
1992   2     2.2
1992   3     2.3
1992   4     2.4

查成如下结果:

year m1  m2  m3   m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4     

SQL:

分析:按需求和格式进行操作
​
select year,
(select amount from tb1 t1 where month=1 and tb1.year =t1.year) as b1,
(select amount from tb1 t2 where month=2 and tb1.year =t2.year) as b2,
(select amount from tb1 t3 where month=3 and tb1.year =t3.year) as b3,
(select amount from tb1 t4 where month=4 and tb1.year =t4.year) as b4
from tb1
group by year;

5.说明:复制表(只复制结构,源表名:a新表名:b)

SQL

select * into b from a where 1<>1 
(where1=1,拷贝表结构和数据内容)

ORACLE

create table b
As
Select * from a where 1=2 
###“<>”解释:
[<>(不等于)(SQL Server Compact)
比较两个表达式。 当使用此运算符比较非空表达式时,如果左操作数不等于右操作数,则结果为 TRUE。 否则,结果为 FALSE。]

6.原表:

courseid coursename score

1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80

为了便于阅读,查询此表后的结果显式如下(及格分数为60): courseid coursename score mark

1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass

SQL

需求分析:就是增加一个字段进行记录成绩是pass还是fail
         利用if(,,)语句相当三目运算符即可
select
courseid,
coursenaem,
score,
if(score>=60,"pass","fail") as mark
from
tableName

7.表名:购物信息

购物人      商品名称     数量
A            甲          2
B            乙          4
C            丙          1
A            丁          2
B            丙          5
……

SQL

需求:给出所有购入商品为两种或两种以上的购物人记录
分析: 按照购物人和商品进行分组并且过滤
      给出购物人记录
​
select
购物人,
商品名称,
数量
from
购物信息
where
购物人
in(
select
购物人
from
购物信息
group by
购物人
having count(*) > =2
);

8.info 表

date result
2005-05-09 win
2005-05-09 lose 
2005-05-09 lose 
2005-05-09 lose 
2005-05-10 win 
2005-05-10 lose 
2005-05-10 lose 

如果要生成下列结果, 该如何写sql语句?

SQL

win lose
2005-05-09  1   3 
2005-05-10  1   2 
​
(1)
select data,sum(case result="win" then 1 else 0 end) as "win",
sum(case when result="lose" then 1 else 0 end) as "lose"
from info
group by
date;
​
(2)
select a.date,a.result as win,b.result as lose
from
(select date,count(result) as result from info where result="win" group by date) as a
join
(select date,count(result) as result from info where result ="lose" group by date) as b
on
a.date = b.date;
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/439257.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号