[hive] 經典sql題及答案(一)

推薦:

經典sql題及答案(二)
經典sql題及答案(三)

題目部分

第1題
我們有如下的用戶訪問數據
userId visitDate visitCount
u01 2017/1/21 5
u02 2017/1/23 6
u03 2017/1/22 8
u04 2017/1/20 3
u01 2017/1/23 6
u01 2017/2/21 8
U02 2017/1/23 6
U01 2017/2/22 4
要求使用SQL統計出每個用戶的累積訪問次數,如下表所示:
用戶id 月份 小計 累積
u01 2017-01 11 11
u01 2017-02 12 23
u02 2017-01 12 12
u03 2017-01 8 8
u04 2017-01 3 3

第2題 京東
有50W個京東店鋪,每個顧客訪客訪問任何一個店鋪的任何一個商品時都會產生一條訪問日誌,訪問日誌存儲的表名爲Visit,訪客的用戶id爲user_id,被訪問的店鋪名稱爲shop,請統計:
1)每個店鋪的UV(訪客數)
2)每個店鋪訪問次數top3的訪客信息。輸出店鋪名稱、訪客id、訪問次數

第3題
已知一個表STG.ORDER,有如下字段:Date,Order_id,User_id,amount。請給出sql進行統計:數據樣例:2017-01-01,10029028,1000003251,33.57。
1)給出 2017年每個月的訂單數、用戶數、總成交金額。
2)給出2017年11月的新客數(指在11月纔有第一筆訂單)

第4題
有一個5000萬的用戶文件(user_id,name,age),一個2億記錄的用戶看電影的記錄文件(user_id,url),根據年齡段觀看電影的次數進行排序?

第5題
有日誌如下,請寫出代碼求得所有用戶和活躍用戶的總數及平均年齡。(活躍用戶指連續兩天都有訪問記錄的用戶)
日期 用戶 年齡
11,test_1,23
11,test_2,19
11,test_3,39
11,test_1,23
11,test_3,39
11,test_1,23
12,test_2,19
13,test_1,23

第6題
請用sql寫出所有用戶中在今年10月份第一次購買商品的金額,表ordertable字段(購買用戶:userid,金額:money,購買時間:paymenttime(格式:2017-10-01),訂單id:orderid)

第7題
現有圖書管理數據庫的三個數據模型如下:
圖書(數據表名:BOOK)
序號 字段名稱 字段描述 字段類型
1 BOOK_ID 總編號 文本
2 SORT 分類號 文本
3 BOOK_NAME 書名 文本
4 WRITER 作者 文本
5 OUTPUT 出版單位 文本
6 PRICE 單價 數值(保留小數點後2位)
讀者(數據表名:READER)
序號 字段名稱 字段描述 字段類型
1 READER_ID 借書證號 文本
2 COMPANY 單位 文本
3 NAME 姓名 文本
4 SEX 性別 文本
5 GRADE 職稱 文本
6 ADDR 地址 文本
借閱記錄(數據表名:BORROW LOG)
序號 字段名稱 字段描述 字段類型
1 READER_ID 借書證號 文本
2 BOOK_D 總編號 文本
3 BORROW_ATE 借書日期 日期
(1)創建圖書管理庫的圖書、讀者和借閱三個基本表的表結構。請寫出建表語句。
(2)找出姓李的讀者姓名(NAME)和所在單位(COMPANY)。
(3)查找“高等教育出版社”的所有圖書名稱(BOOK_NAME)及單價(PRICE),結果按單價降序排序。
(4)查找價格介於10元和20元之間的圖書種類(SORT)出版單位(OUTPUT)和單價(PRICE),結果按出版單位(OUTPUT)和單價(PRICE)升序排序。
(5)查找所有借了書的讀者的姓名(NAME)及所在單位(COMPANY)。
(6)求”科學出版社”圖書的最高單價、最低單價、平均單價。
(7)找出當前至少借閱了2本圖書(大於等於2本)的讀者姓名及其所在單位。
(8)考慮到數據安全的需要,需定時將“借閱記錄”中數據進行備份,請使用一條SQL語句,在備份用戶bak下創建與“借閱記錄”表結構完全一致的數據表BORROW_LOG_BAK.井且將“借閱記錄”中現有數據全部複製到BORROW_1.0G_ BAK中。
(9)現在需要將原Oracle數據庫中數據遷移至Hive倉庫,請寫出“圖書”在Hive中的建表語句(Hive實現,提示:列分隔符|;數據表數據需要外部導入:分區分別以month_part、day_part 命名)
(10)Hive中有表A,現在需要將表A的月分區 201505 中 user_id爲20000的user_dinner字段更新爲bonc8920,其他用戶user_dinner字段數據不變,請列出更新的方法步驟。(Hive實現,提示:Hlive中無update語法,請通過其他辦法進行數據更新)

第8題
有一個線上服務器訪問日誌格式如下(用sql答題)
時間 接口 ip地址
2016-11-09 11:22:05 /api/user/login 110.23.5.33
2016-11-09 11:23:10 /api/user/detail 57.3.2.16

2016-11-09 23:59:40 /api/user/login 200.6.5.166
求11月9號下午14點(14-15點),訪問api/user/login接口的top10的ip地址

第9題
有一個充值日誌表如下:

CREATE TABLE `credit log` 
(
    `dist_id` int11DEFAULT NULL COMMENT '區組id',
    `account` varchar100DEFAULT NULL COMMENT '賬號',
    `money` int(11) DEFAULT NULL COMMENT '充值金額',
    `create_time` datetime DEFAULT NULL COMMENT '訂單時間'
)ENGINE=InnoDB DEFAUILT CHARSET-utf8

請寫出SQL語句,查詢充值日誌表2015年7月9號每個區組下充值額最大的賬號,要求結果:
區組id,賬號,金額,充值時間
第10題
有一個賬號表如下,請寫出SQL語句,查詢各自區組的money排名前十的賬號(分組取前10)

CREATE TABIE `account` 
(
    `dist_id` int11DEFAULT NULL COMMENT '區組id'`account` varchar100DEFAULT NULL COMMENT '賬號' ,
    `gold` int11DEFAULT NULL COMMENT '金幣' 
    PRIMARY KEY`dist_id``account_id`),
)ENGINE=InnoDB DEFAULT CHARSET-utf8

第11題
1)有三張表分別爲會員表(member)銷售表(sale)退貨表(regoods)
(1)會員表有字段memberid(會員id,主鍵)credits(積分);
(2)銷售表有字段memberid(會員id,外鍵)購買金額(MNAccount);
(3)退貨表中有字段memberid(會員id,外鍵)退貨金額(RMNAccount);
2)業務說明:
(1)銷售表中的銷售記錄可以是會員購買,也可是非會員購買。(即銷售表中的memberid可以爲空)
(2)銷售表中的一個會員可以有多條購買記錄
(3)退貨表中的退貨記錄可以是會員,也可是非會員4、一個會員可以有一條或多條退貨記錄
查詢需求:分組查出銷售表中所有會員購買金額,同時分組查出退貨表中所有會員的退貨金額,把會員id相同的購買金額-退款金額得到的結果更新到表會員表中對應會員的積分字段(credits)

答案部分

01
u01	2017/1/21	5
u02	2017/1/23	6
u03	2017/1/22	8
u04	2017/1/20	3
u01	2017/1/23	6
u01	2017/2/21	8
u02	2017/1/23	6
u01	2017/2/22	4

create table sql01(userid string,visitdate string,visitcount int)
row format delimited fields terminated by '\t'
stored as textfile;

select userid,
date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM') dt,
sum(visitcount) sum
from sql01
group by userid,date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM');t1

select userid,dt,sum,sum(sum) over(partition by userid order by dt rows between unbounded preceding and current row) sum2
from (select userid,
date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM') dt,
sum(visitcount) sum
from sql01
group by userid,date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM'))t1;

02
u01	a
u02	b
u03	b
u04	a
u01	b
u01	c
u02	b
u01	c
u01	a
u02	b
u03	c
u04	a
u01	c
u01	c
u02	a
u01	b

create table sql02(userid string,shop string)
row format delimited fields terminated by '\t'
stored as textfile;

load data local inpath '/root/in/sql02' into table sql02;

去重每個店的用戶
select shop,userid from sql02 group by shop,userid;t1

計算pv
select 
shop,
count(*)
from (select shop,userid from sql02 group by shop,userid)t1
group by shop;


去重每個店的每個用戶,獲得數量
select
userid,
shop,
count(*) num
from 
sql02
group by userid,shop;t1

排名
select
shop,
userid,
num,
row_number() over(partition by shop order by num desc) rank
from
(select
userid,
shop,
count(*) num
from 
sql02
group by userid,shop)t1;t2

取前三
select shop,userid,num
from
(select
shop,
userid,
num,
row_number() over(partition by shop order by num desc) rank
from
(select
userid,
shop,
count(*) num
from 
sql02
group by userid,shop)t1)t2
where rank<3;

03
2016-01-01,100290212,1000325123,32
2017-01-01,100290282,1000325123,32
2017-01-01,101290281,1000003251,43
2017-01-01,102290291,1000003251,33
2017-01-01,103290281,1100000325,33
2017-02-02,104290881,1000003251,33
2017-02-02,105290281,1100000325,33
2017-02-02,106290281,1100000325,33
2017-11-02,107902821,1000032532,34
2017-11-02,108902821,1000032433,42
2017-12-02,108202821,1000032433,42

create table sql03(dt string,orderid int,userid int,amount int)
row format delimited fields terminated by ','
stored as textfile;

load data local inpath '/root/in/sql03' into table sql03;

1)給出 2017年每個月的訂單數、用戶數、總成交金額。
得到yyyy-MM的格式
select
date_format(dt,'yyyy-MM') dtt,
userid,
orderid,
amount
from sql03;t1

獲取每個月每個用戶的訂單數,成交金額
select
dtt,
userid,
count(*) order_num,
sum(amount) amount_num
from
(select
date_format(dt,'yyyy-MM') dtt,
userid,
orderid,
amount
from sql03)t1
where substring(dtt,0,4)='2017'
group by dtt,userid;t2

每個月的訂單數、用戶數、總成交金額
select 
dtt,
sum(order_num) all_order_num,
count(*) all_user_num,
sum(amount_num) all_amount_num
from 
(select
dtt,
userid,
count(*) order_num,
sum(amount) amount_num
from
(select
date_format(dt,'yyyy-MM') dtt,
userid,
orderid,
amount
from sql03)t1
where substring(dtt,0,4)='2017'
group by dtt,userid)t2
group by dtt;

2)給出201711月的新客數(指在11月纔有第一筆訂單)
得到yyyy-MM的格式
select
date_format(dt,'yyyy-MM') dtt,
userid,
orderid,
amount
from sql03;t1

每個月的客戶去重
select
dtt,
userid
from
(select
date_format(dt,'yyyy-MM') dtt,
userid,
orderid
from sql03)t2
group by dtt,userid;t2

客戶按照時間升序排序
select
userid,
dtt,
row_number() over(partition by userid order by dtt) `rank`
from
(select
dtt,
userid
from
(select
date_format(dt,'yyyy-MM') dtt,
userid,
orderid
from sql03)t2
group by dtt,userid)t2;t3

取201711月第一次下訂單的客戶
select 
userid
from
(select
userid,
dtt,
row_number() over(partition by userid order by dtt) `rank`
from
(select
dtt,
userid
from
(select
date_format(dt,'yyyy-MM') dtt,
userid,
orderid
from sql03)t2
group by dtt,userid)t2)t3
where 
`rank`=1 and dtt='2017-11';

05
11,test_1,23
11,test_2,19
11,test_3,39
11,test_1,23
11,test_3,39
11,test_1,23
12,test_2,19
13,test_1,23

create table sql05(dt int,user_id string,age int)
row format
delimited fields terminated by","
stored as textfile;

load data local inpath '/root/in/sql05' into table sql05;

1 首先去重並加一列標記
select
dt,
user_id,
row_number() over(partition by user_id order by dt) `rank`
from
sql05
group by
dt,user_id;t1
2 如果dt-`rank`的值連續兩行保持不變,那麼此用戶爲活躍用戶.
select
user_id,
dt - `rank` sub
from
(select
dt,
user_id,
row_number() over(partition by user_id order by dt) `rank`
from
sql05
group by
dt,user_id)t1;t2
3 計數,取活躍用戶
select
user_id,
count(*)
from
(select
user_id,
dt - `rank` sub
from
(select
dt,
user_id,
row_number() over(partition by user_id order by dt) `rank`
from
sql05
group by
dt,user_id)t1)t2
group by
user_id,sub
having
count(*)>1;t3
4 兩邊關聯查詢,計算平均年齡
select 
avg(age)
from
(select
age,
user_id
from
sql05
group by
user_id,age)t4
join
(select
user_id,
count(*)
from
(select
user_id,
dt - `rank` sub
from
(select
dt,
user_id,
row_number() over(partition by user_id order by dt) `rank`
from
sql05
group by
dt,user_id)t2)t3
group by
user_id,sub
having
count(*)>1)t5
on
t4.user_id=t5.user_id;

06
101	44	2016-5-11	1111
101	54	2017-5-11	1112
101	64	2017-10-11	1113
101	74	2017-10-14	1114
102	14	2017-5-11	1115
102	44	2017-6-11	1116
103	44	2017-10-13	1117
104	44	2017-10-14	1118
104	144	2017-10-11	1119
105	44	2017-10-11	1121

create table sql06(userid string,money int,paymenttime string,orderid int)
row format
delimited fields terminated by '\t'
stored as textfile;

load data local inpath '/root/in/sql06' into table sql06;

1 獲取所有用戶今年十月份的交易記錄
select
userid,
money,
paymenttime
from
sql06
where
substring(paymenttime,0,7)='2017-10';t1
2 按用戶分組,時間排序
select
userid,
money,
paymenttime,
row_number() over(partition by userid order by paymenttime) `rank`
from
(select
userid,
money,
paymenttime
from
sql06
where
substring(paymenttime,0,7)='2017-10')t1;t2
3 取排第一的交易記錄及金額
select
userid,
money
from
(select
userid,
money,
paymenttime,
row_number() over(partition by userid order by paymenttime) `rank`
from
(select
userid,
money,
paymenttime
from
sql06
where
substring(paymenttime,0,7)='2017-10')t1)t2
where
`rank`=1;

08
select ip ,count(*) count
from server 
where (date_format(`time`,'yyyy-MM-dd HH')='2016-11-09 14' or `time`='2016-11-09 15:00:00') and interface='/api/user/login'
group by ip
order by count desc
limit 10;

09
1	11	1000	2015-11-04
1	12	100	2015-7-09
2	21	50	2015-7-09
2	22	150	2015-7-09
3	32	350	2015-7-09

create table sql09(dist_id int,account int,money int,dt string)
row format delimited fields terminated by '\t'
stored as textfile;

load data local inpath '/root/in/sql09' into table sql09;

獲得201779日每個區組最大的充值金額
select
dist_id,
max(money) money
from
sql09
where dt='2015-7-09'
group by
dist_id;t1
關聯查詢獲得賬號
select
t.dist_id,
t.account,
t.money,
t.dt
from
sql09 t
join
(select
dist_id,
max(money) money
from
sql09
where dt='2015-7-09'
group by
dist_id)t1
on
t.dist_id=t1.dist_id and t.money=t1.money;

12
create table student
(
	id bigint comment ‘學號’,
	name string comment ‘姓名’,
	age bigint comment ‘年齡’
);
create table course
(
	cid string comment ‘課程號,001/002格式’,
	cname string comment ‘課程名’
);
create table score
(
	Id bigint comment ‘學號’,
	cid string comment ‘課程號’,
	score bigint comment ‘成績’
) partitioned by(event_day string)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章