分享

HiveSQL面试10题详解




问题导读:

1、怎样使用SQL统计出每个用户的累积访问次数?
2、怎样使用SQL查询和排序亿级记录?
3、怎样使用SQL查询并排序分组取出前10?



第一题
1、需求
我们有如下的用户访问数据

userId
visitDatevisitCount
u01
2021/1/21
5

u02
2021/1/236

u03
2021/1/228

u04
2021/1/203

u01
2021/1/236

u01
2021/2/218

u02
2021/1/236
u012021/2/224

要求使用SQL统计出每个用户的累积访问次数,如下表所示:

用户id月份小计累计
u012021-011111
u012021-021223
u022021-011212
u032021-0188
u042021-0133

2、数据准备

  1. CREATE TABLE test_sql.test1 ( userId string, visitDate string, visitCount INT ) ROW format delimited FIELDS TERMINATED BY "\t";
  2. INSERT INTO TABLE test_sql.test1
  3. VALUES
  4.         ( 'u01', '2021/1/21', 5 ),
  5.         ( 'u02', '2021/1/23', 6 ),
  6.         ( 'u03', '2021/1/22', 8 ),
  7.         ( 'u04', '2021/1/20', 3 ),
  8.         ( 'u01', '2021/1/23', 6 ),
  9.         ( 'u01', '2021/2/21', 8 ),
  10.         ( 'u02', '2021/1/23', 6 ),
  11.         ( 'u01', '2021/2/22', 4 );
复制代码

3、查询SQL

  1. SELECT
  2.         t2.userid,
  3.         t2.visitmonth,
  4.         subtotal_visit_cnt,
  5.         sum( subtotal_visit_cnt ) over ( PARTITION BY userid ORDER BY visitmonth ) AS total_visit_cnt
  6. FROM
  7.         (
  8.         SELECT
  9.                 userid,
  10.                 visitmonth,
  11.                 sum( visitcount ) AS subtotal_visit_cnt
  12.         FROM
  13.                 ( SELECT userid, date_format( regexp_replace ( visitdate, '/', '-' ), 'yyyy-MM' ) AS visitmonth, visitcount FROM test_sql.test1 ) t1
  14.         GROUP BY
  15.                 userid,
  16.                 visitmonth
  17.         ) t2
  18. ORDER BY
  19.         t2.userid,
  20.         t2.visitmonth;
复制代码

4、执行结果

20210707080905604.png

第二题

1、需求

有50W个京东店铺,每个顾客访客访问任何一个店铺的任何一个商品时都会产生一条访问日志,访问日志存储的表名为Visit,访客的用户id为user_id,被访问的店铺名称为shop,数据如下:

user_idshop
u1a
u2b
u1b
u1a
u3c
u4b
u1a
u2c
u5b
u4b
u6c
u2c
u1b
u2a
u2a
u3a
u5a
u5a
u5a

请统计:

(1)每个店铺的UV(访客数)
(2)每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数

2、数据准备

  1. CREATE TABLE test_sql.test2 ( user_id string, shop string ) ROW format delimited FIELDS TERMINATED BY '\t';
  2. INSERT INTO TABLE test_sql.test2
  3. VALUES
  4.         ( 'u1', 'a' ),
  5.         ( 'u2', 'b' ),
  6.         ( 'u1', 'b' ),
  7.         ( 'u1', 'a' ),
  8.         ( 'u3', 'c' ),
  9.         ( 'u4', 'b' ),
  10.         ( 'u1', 'a' ),
  11.         ( 'u2', 'c' ),
  12.         ( 'u5', 'b' ),
  13.         ( 'u4', 'b' ),
  14.         ( 'u6', 'c' ),
  15.         ( 'u2', 'c' ),
  16.         ( 'u1', 'b' ),
  17.         ( 'u2', 'a' ),
  18.         ( 'u2', 'a' ),
  19.         ( 'u3', 'a' ),
  20.         ( 'u5', 'a' ),
  21.         ( 'u5', 'a' ),
  22.         ( 'u5', 'a' );
复制代码

3、查询SQL实现

(1)

方式1:

  1. # 每个店铺的UV(访客数)
  2. SELECT shop,count(DISTINCT user_id) FROM test_sql.test2 GROUP BY shop
复制代码

方式2:

  1. #每个店铺的UV(访客数)
  2. SELECT
  3.         t.shop,
  4.         count(*)
  5. FROM
  6.         ( SELECT user_id, shop FROM test_sql.test2 GROUP BY user_id, shop ) t
  7. GROUP BY
  8.         t.shop;
复制代码

(2)
  
  1. #每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数
  2. SELECT
  3.         t2.shop,
  4.         t2.user_id,
  5.         t2.cnt
  6. FROM
  7.         (
  8.         SELECT
  9.                 t1.*,
  10.                 row_number() over ( PARTITION BY t1.shop ORDER BY t1.cnt DESC ) rank
  11.         FROM
  12.                 ( SELECT user_id, shop, count(*) AS cnt FROM test_sql.test2 GROUP BY user_id, shop ) t1
  13.         ) t2
  14. WHERE
  15.         rank <= 3;
复制代码

4、执行结果

(1)

20210707083720164.png

(2)

20210707083839822.png

第三题

1、需求

已知一个表STG.ORDER,有如下字段:Date,Order_id,User_id,amount。

数据样例:2021-01-01,10029028,1000003251,33.57。

请给出sql进行统计:

(1)给出 2021年每个月的订单数、用户数、总成交金额。
(2)给出2021年11月的新客数(指在11月才有第一笔订单)

2、数据准备

  1. CREATE TABLE test_sql.test3 ( dt string, order_id string, user_id string, amount DECIMAL ( 10, 2 ) ) ROW format delimited FIELDS TERMINATED BY '\t';
  2. INSERT INTO TABLE test_sql.test3
  3. VALUES
  4.         ( '2021-01-01', '10029028', '1000003251', 33.57 );
  5. INSERT INTO TABLE test_sql.test3
  6. VALUES
  7.         ( '2021-01-01', '10029029', '1000003251', 33.57 );
  8. INSERT INTO TABLE test_sql.test3
  9. VALUES
  10.         ( '2021-01-01', '100290288', '1000003252', 33.57 );
  11. INSERT INTO TABLE test_sql.test3
  12. VALUES
  13.         ( '2021-02-02', '10029088', '1000003251', 33.57 );
  14. INSERT INTO TABLE test_sql.test3
  15. VALUES
  16.         ( '2021-02-02', '100290281', '1000003251', 33.57 );
  17. INSERT INTO TABLE test_sql.test3
  18. VALUES
  19.         ( '2021-02-02', '100290282', '1000003253', 33.57 );
  20. INSERT INTO TABLE test_sql.test3
  21. VALUES
  22.         ( '2021-11-02', '10290282', '100003253', 234 );
  23. INSERT INTO TABLE test_sql.test3
  24. VALUES
  25.         ( '2018-11-02', '10290284', '100003243', 234 );
复制代码

3、查询SQL

(1)给出 2021年每个月的订单数、用户数、总成交金额。

  1. SELECT
  2.         t1.mon,
  3.         count( t1.order_id ) AS order_cnt,
  4.         count( DISTINCT t1.user_id ) AS user_cnt,
  5.         sum( amount ) AS total_amount
  6. FROM
  7.         (
  8.         SELECT
  9.                 order_id,
  10.                 user_id,
  11.                 amount,
  12.                 date_format( dt, 'yyyy-MM' ) mon
  13.         FROM
  14.                 test_sql.test3
  15.         WHERE
  16.                 date_format( dt, 'yyyy' ) = '2021'
  17.         ) t1
  18. GROUP BY
  19.         t1.mon;
复制代码

(2)给出2021年11月的新客数(指在11月才有第一笔订单)

  1. SELECT
  2.         count( user_id )
  3. FROM
  4.         test_sql.test3
  5. GROUP BY
  6.         user_id
  7. HAVING
  8.         date_format( min( dt ), 'yyyy-MM' )= '2021-11';
复制代码

4、 执行结果

(1)

20210707222624614.png

(2)

2021070722265716.png

第四题

1、需求

有一个5000万的用户文件(user_id,name,age),一个2亿记录的用户看电影的记录文件(user_id, url),根据年龄段观看电影的次数进行排序?

2、数据准备

  1. CREATE TABLE test_sql.test4user ( user_id string, NAME string, age INT );
  2. CREATE TABLE test_sql.test4log ( user_id string, url string );
  3. INSERT INTO TABLE test_sql.test4user
  4. VALUES
  5.         ( '001', 'u1', 10 );
  6. INSERT INTO TABLE test_sql.test4user
  7. VALUES
  8.         ( '002', 'u2', 15 );
  9. INSERT INTO TABLE test_sql.test4user
  10. VALUES
  11.         ( '003', 'u3', 15 );
  12. INSERT INTO TABLE test_sql.test4user
  13. VALUES
  14.         ( '004', 'u4', 20 );
  15. INSERT INTO TABLE test_sql.test4user
  16. VALUES
  17.         ( '005', 'u5', 25 );
  18. INSERT INTO TABLE test_sql.test4user
  19. VALUES
  20.         ( '006', 'u6', 35 );
  21. INSERT INTO TABLE test_sql.test4user
  22. VALUES
  23.         ( '007', 'u7', 40 );
  24. INSERT INTO TABLE test_sql.test4user
  25. VALUES
  26.         ( '008', 'u8', 45 );
  27. INSERT INTO TABLE test_sql.test4user
  28. VALUES
  29.         ( '009', 'u9', 50 );
  30. INSERT INTO TABLE test_sql.test4user
  31. VALUES
  32.         ( '0010', 'u10', 65 );
  33. INSERT INTO TABLE test_sql.test4log
  34. VALUES
  35.         ( '001', 'url1' );
  36. INSERT INTO TABLE test_sql.test4log
  37. VALUES
  38.         ( '002', 'url1' );
  39. INSERT INTO TABLE test_sql.test4log
  40. VALUES
  41.         ( '003', 'url2' );
  42. INSERT INTO TABLE test_sql.test4log
  43. VALUES
  44.         ( '004', 'url3' );
  45. INSERT INTO TABLE test_sql.test4log
  46. VALUES
  47.         ( '005', 'url3' );
  48. INSERT INTO TABLE test_sql.test4log
  49. VALUES
  50.         ( '006', 'url1' );
  51. INSERT INTO TABLE test_sql.test4log
  52. VALUES
  53.         ( '007', 'url5' );
  54. INSERT INTO TABLE test_sql.test4log
  55. VALUES
  56.         ( '008', 'url7' );
  57. INSERT INTO TABLE test_sql.test4log
  58. VALUES
  59.         ( '009', 'url5' );
  60. INSERT INTO TABLE test_sql.test4log
  61. VALUES
  62.         ( '0010', 'url1' );
复制代码

3、查询SQL
  
方式1

  1. SELECT
  2.         t2.age_phase,
  3.         sum( t1.cnt ) AS view_cnt
  4. FROM
  5.         ( SELECT user_id, count(*) cnt FROM test_sql.test4log GROUP BY user_id ) t1
  6.         JOIN (
  7.         SELECT
  8.                 user_id,
  9.         CASE
  10.                         
  11.                         WHEN age <= 10 AND age > 0 THEN
  12.                         '0-10'
  13.                         WHEN age <= 20 AND age > 10 THEN
  14.                         '10-20'
  15.                         WHEN age > 20
  16.                         AND age <= 30 THEN '20-30' WHEN age > 30
  17.                                 AND age <= 40 THEN '30-40' WHEN age > 40
  18.                                         AND age <= 50 THEN '40-50' WHEN age > 50
  19.                                                 AND age <= 60 THEN '50-60' WHEN age > 60
  20.                                                         AND age <= 70 THEN
  21.                                                                 '60-70' ELSE '70以上'
  22.                                                                 END AS age_phase
  23.                                                 FROM
  24.                                                         test_sql.test4user
  25.                                                 ) t2 ON t1.user_id = t2.user_id
  26.                                         GROUP BY
  27.                                         t2.age_phase;
复制代码

方式2

  1. SELECT
  2.         concat( phase - 10, '-', phase ),
  3.         sum( cnt ) sum_movies
  4. FROM
  5.         (
  6.         SELECT
  7.                 *,
  8.                 ceil( age / 10 ) * 10 phase
  9.         FROM
  10.                 test4user a
  11.                 JOIN ( SELECT user_id, count( url ) cnt FROM test4log GROUP BY user_id ) b ON a.user_id = b.user_id
  12.         ) c
  13. GROUP BY
  14.         c.phase;
复制代码

4、执行结果

方式1

2021070723001986.png

方式2

20210707230059794.png


第五题

1、需求

有日志如下,请写出代码求得所有用户和活跃用户的总数及平均年龄。(活跃用户指连续两天都有 访问记录的用户)

日期用户年龄
2019-02-11test_123
2019-02-11test_219
2019-02-11test_339
2019-02-11test_123
2019-02-11test_339
2019-02-11test_123
2019-02-12test_219
2019-02-13test_123
2019-02-15test_219
2019-02-16test_219

2、数据准备

  1. CREATE TABLE test5 ( dt string, user_id string, age INT ) ROW format delimited FIELDS TERMINATED BY ',';
  2. INSERT INTO TABLE test_sql.test5
  3. VALUES
  4.         ( '2019-02-11', 'test_1', 23 );
  5. INSERT INTO TABLE test_sql.test5
  6. VALUES
  7.         ( '2019-02-11', 'test_2', 19 );
  8. INSERT INTO TABLE test_sql.test5
  9. VALUES
  10.         ( '2019-02-11', 'test_3', 39 );
  11. INSERT INTO TABLE test_sql.test5
  12. VALUES
  13.         ( '2019-02-11', 'test_1', 23 );
  14. INSERT INTO TABLE test_sql.test5
  15. VALUES
  16.         ( '2019-02-11', 'test_3', 39 );
  17. INSERT INTO TABLE test_sql.test5
  18. VALUES
  19.         ( '2019-02-11', 'test_1', 23 );
  20. INSERT INTO TABLE test_sql.test5
  21. VALUES
  22.         ( '2019-02-12', 'test_2', 19 );
  23. INSERT INTO TABLE test_sql.test5
  24. VALUES
  25.         ( '2019-02-13', 'test_1', 23 );
  26. INSERT INTO TABLE test_sql.test5
  27. VALUES
  28.         ( '2019-02-15', 'test_2', 19 );
  29. INSERT INTO TABLE test_sql.test5
  30. VALUES
  31.         ( '2019-02-16', 'test_2', 19 );
复制代码

3、查询SQL

方式1

  1. SELECT
  2.         sum( total_user_cnt ) total_user_cnt,
  3.         sum( total_user_avg_age ) total_user_avg_age,
  4.         sum( two_days_cnt ) two_days_cnt,
  5.         sum( avg_age ) avg_age
  6. FROM
  7.         (
  8.         SELECT
  9.                 0 total_user_cnt,
  10.                 0 total_user_avg_age,
  11.                 count(*) AS two_days_cnt,
  12.                 cast(
  13.                 sum( age ) / count(*) AS DECIMAL ( 5, 2 )) AS avg_age
  14.         FROM
  15.                 (
  16.                 SELECT
  17.                         user_id,
  18.                         max( age ) age
  19.                 FROM
  20.                         (
  21.                         SELECT
  22.                                 user_id,
  23.                                 max( age ) age
  24.                         FROM
  25.                                 (
  26.                                 SELECT
  27.                                         user_id,
  28.                                         age,
  29.                                         date_sub( dt, rank ) flag
  30.                                 FROM
  31.                                         (
  32.                                         SELECT
  33.                                                 dt,
  34.                                                 user_id,
  35.                                                 max( age ) age,
  36.                                                 row_number() over ( PARTITION BY user_id ORDER BY dt ) rank
  37.                                         FROM
  38.                                                 test_sql.test5
  39.                                         GROUP BY
  40.                                                 dt,
  41.                                                 user_id
  42.                                         ) t1
  43.                                 ) t2
  44.                         GROUP BY
  45.                                 user_id,
  46.                                 flag
  47.                         HAVING
  48.                                 count(*) >= 2
  49.                         ) t3
  50.                 GROUP BY
  51.                         user_id
  52.                 ) t4 UNION ALL
  53.         SELECT
  54.                 count(*) total_user_cnt,
  55.                 cast(
  56.                 sum( age ) / count(*) AS DECIMAL ( 5, 2 )) total_user_avg_age,
  57.                 0 two_days_cnt,
  58.                 0 avg_age
  59.         FROM
  60.                 ( SELECT user_id, max( age ) age FROM test_sql.test5 GROUP BY user_id ) t5
  61.         ) t6;
复制代码

方式2

  1. SELECT
  2.         *
  3. FROM
  4.         (
  5.         SELECT
  6.                 count( user_id ) total_cnt_users,
  7.                 avg( age ) total_avg_age
  8.         FROM
  9.                 ( SELECT user_id, max( age ) age FROM test5 GROUP BY user_id ) g
  10.         ) h
  11.         CROSS JOIN (
  12.         SELECT
  13.                 count( user_id ) hot_users_count,
  14.                 avg( age ) hot_age_avg
  15.         FROM
  16.                 (
  17.                 SELECT
  18.                         d.user_id,
  19.                         max( d.age ) age
  20.                 FROM
  21.                         (
  22.                         SELECT
  23.                                 user_id,
  24.                                 max( age ) age,
  25.                                 count( 1 ) cnt
  26.                         FROM
  27.                                 (
  28.                                 SELECT
  29.                                         *,
  30.                                         date_sub( dt, rank ) dt2
  31.                                 FROM
  32.                                         (
  33.                                         SELECT
  34.                                                 user_id,
  35.                                                 dt,
  36.                                                 max( age ) age,
  37.                                                 ROW_NUMBER() over ( PARTITION BY a.user_id ORDER BY a.dt ) rank
  38.                                         FROM
  39.                                                 ( SELECT DISTINCT dt, age, user_id FROM test5 ) a
  40.                                         GROUP BY
  41.                                                 a.user_id,
  42.                                                 a.dt
  43.                                         ) b
  44.                                 ) c
  45.                         GROUP BY
  46.                                 c.user_id,
  47.                                 c.dt2
  48.                         HAVING
  49.                                 cnt > 1
  50.                         ) d
  51.                 GROUP BY
  52.                         d.user_id
  53.                 ) e
  54.         ) f ON 1 = 1;
复制代码

4、执行结果

方式1

20210707232100591.png

方式2

20210707232144642.png

第六题

1、需求

请用sql写出所有用户中在今年10月份第一次购买商品的金额, 表ordertable字段:(购买用户:userid,金额:money,购买时间:paymenttime(格式:2021-10-01), 订单id:orderid

2、数据准备

  1. CREATE TABLE test_sql.test6 ( userid string, money DECIMAL ( 10, 2 ), paymenttime string, orderid string );
  2. INSERT INTO TABLE test_sql.test6
  3. VALUES
  4.         ( '001', 100, '2021-10-01', '123' );
  5. INSERT INTO TABLE test_sql.test6
  6. VALUES
  7.         ( '001', 200, '2021-10-02', '124' );
  8. INSERT INTO TABLE test_sql.test6
  9. VALUES
  10.         ( '002', 500, '2021-10-01', '125' );
  11. INSERT INTO TABLE test_sql.test6
  12. VALUES
  13.         ( '001', 100, '2021-11-01', '126' );
复制代码

3、查询SQL

  1. SELECT
复制代码

4、执行结果

2021070723493854.png

第七题

1、需求

现有图书管理数据库的三个数据模型如下:

图书(数据表名:BOOK)

序号字段名称字段描述字段类型
1BOOK_ID总编号文本
2SORT分类号文本
3BOOK_NAME书名文本
4WRITER作者文本
5OUTPUT出版单位文本
6PRICE单位数值(保留小数点后2位)

读者(数据表名:READER)

序号字段名称字段描述字段类型
1READER_ID借书证号文本
2COMPANY单位文本
3NAME姓名文本
4SEX性别文本
5GRADE职称文本
6ADDR地址文本

借阅记录(数据表名:BORROW LOG)

序号字段名称字段描述字段类型
1READER_ID借书证号文本
2BOOK_ID总编号文本
3BORROW_DATE借书日期日期

(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_L0G_ BAK中。
(9)现在需要将原Oracle数据库中数据迁移至Hive仓库,请写出“图书”在Hive中的建表语句(Hive实现,提示:列分隔符|;数据表数据需要外部导入:分区分别以month_part、day_part 命名)
(10)Hive中有表A,现在需要将表A的月分区 202106中 user_id为20000的user_dinner字段更新为bonc8920,其他用户user_dinner字段数据不变,请列出更新的方法步骤。(Hive实现, 提示:Hlive中无update语法,请通过其他办法进行数据更新)


2、数据准备

(1) 创建图书表book

  1. CREATE TABLE test_sql.book (
  2.         book_id string,
  3.         `SORT` string,
  4.         book_name string,
  5.         writer string,
  6.         OUTPUT string,
  7. price DECIMAL ( 10, 2 ));
  8. INSERT INTO TABLE test_sql.book
  9. VALUES
  10.         ( '001', 'TP391', '信息处理', 'author1', '机械工业出版社', '20' );
  11. INSERT INTO TABLE test_sql.book
  12. VALUES
  13.         ( '002', 'TP392', '数据库', 'author12', '科学出版社', '15' );
  14. INSERT INTO TABLE test_sql.book
  15. VALUES
  16.         ( '003', 'TP393', '计算机网络', 'author3', '机械工业出版社', '29' );
  17. INSERT INTO TABLE test_sql.book
  18. VALUES
  19.         ( '004', 'TP399', '微机原理', 'author4', '科学出版社', '39' );
  20. INSERT INTO TABLE test_sql.book
  21. VALUES
  22.         ( '005', 'C931', '管理信息系统', 'author5', '机械工业出版社', '40' );
  23. INSERT INTO TABLE test_sql.book
  24. VALUES
  25.         ( '006', 'C932', '运筹学', 'author6', '科学出版社', '55' );
  26. INSERT INTO TABLE test_sql.book
  27. VALUES
  28.         ( '007', 'C939', '大数据平台架构与原型实现', 'author7', '高等教育出版社', '66' );
复制代码

(2)创建读者表reader

  1. CREATE TABLE test_sql.reader ( reader_id string, company string, NAME string, sex string, grade string, addr string );
  2. INSERT INTO TABLE test_sql.reader
  3. VALUES
  4.         ( '0001', '阿里巴巴', 'jack', '男', 'vp', 'addr1' );
  5. INSERT INTO TABLE test_sql.reader
  6. VALUES
  7.         ( '0002', '百度', 'robin', '男', 'vp', 'addr2' );
  8. INSERT INTO TABLE test_sql.reader
  9. VALUES
  10.         ( '0003', '腾讯', 'tony', '男', 'vp', 'addr3' );
  11. INSERT INTO TABLE test_sql.reader
  12. VALUES
  13.         ( '0004', '京东', 'jasper', '男', 'cfo', 'addr4' );
  14. INSERT INTO TABLE test_sql.reader
  15. VALUES
  16.         ( '0005', '网易', 'zhangsan', '女', 'ceo', 'addr5' );
  17. INSERT INTO TABLE test_sql.reader
  18. VALUES
  19.         ( '0006', '搜狐', 'lisi', '女', 'ceo', 'addr6' );
  20. INSERT INTO TABLE test_sql.reader
  21. VALUES
  22.         ( '0007', '美团', '李哥', '男', '大数据开发', 'addr7' );
  23.    
复制代码

(3)创建借阅记录表borrow_log

  1. CREATE TABLE test_sql.borrow_log ( reader_id string, book_id string, borrow_date string );
  2. INSERT INTO TABLE test_sql.borrow_log
  3. VALUES
  4.         ( '0001', '002', '2021-10-14' );
  5. INSERT INTO TABLE test_sql.borrow_log
  6. VALUES
  7.         ( '0002', '001', '2021-10-13' );
  8. INSERT INTO TABLE test_sql.borrow_log
  9. VALUES
  10.         ( '0003', '005', '2021-09-14' );
  11. INSERT INTO TABLE test_sql.borrow_log
  12. VALUES
  13.         ( '0004', '006', '2021-08-15' );
  14. INSERT INTO TABLE test_sql.borrow_log
  15. VALUES
  16.         ( '0005', '003', '2021-10-10' );
  17. INSERT INTO TABLE test_sql.borrow_log
  18. VALUES
  19.         ( '0006', '004', '2021-12-13' );
  20. INSERT INTO TABLE test_sql.borrow_log
  21. VALUES
  22.         ( '0007', '003', '2021-10-16' );
  23. INSERT INTO TABLE test_sql.borrow_log
  24. VALUES
  25.         ( '0007', '008', '2021-10-16' );
复制代码

3、查询SQL

(1)创建图书管理库的图书、读者和借阅三个基本表的表结构。请写出建表语句。

  1. CREATE TABLE test_sql.book (
  2.         book_id string,
  3.         `SORT` string,
  4.         book_name string,
  5.         writer string,
  6.         OUTPUT string,
  7. price DECIMAL ( 10, 2 ));
  8. CREATE TABLE test_sql.reader ( reader_id string, company string, NAME string, sex string, grade string, addr string );
  9. CREATE TABLE test_sql.borrow_log ( reader_id string, book_id string, borrow_date string );
复制代码

(2) 找出姓李的读者姓名(NAME)和所在单位(COMPANY)。

  1. SELECT name, company FROM test_sql.reader WHERE name LIKE '李%';
复制代码

(3)查找“高等教育出版社”的所有图书名称(BOOK_NAME)及单价(PRICE),结果按单价降序排序。

  1. SELECT
  2.         book_name,
  3.         price
  4. FROM
  5.         test_sql.book
  6. WHERE
  7.         OUTPUT = "高等教育出版社"
  8. ORDER BY
  9.         price DESC;
复制代码

(4) 查找价格介于10元和20元之间的图书种类(SORT)出版单位(OUTPUT)和单价(PRICE),结 果按出版单位(OUTPUT)和单价(PRICE)升序排序。

方式1

  1. SELECT
  2.         sort,
  3.         output,
  4.         price
  5. FROM
  6.         test_sql.book
  7. WHERE
  8.         price ]= 10
  9.         AND price [= 20
  10. ORDER BY
  11.         output,
  12.         price;
复制代码

方式2

  1. SELECT
  2.         sort,
  3.         output,
  4.         price
  5. FROM
  6.         book
  7. WHERE
  8.         price BETWEEN 10
  9.         AND 20
  10. ORDER BY
  11.         output ASC,
  12.         price ASC;
复制代码

(5)查找所有借了书的读者的姓名(NAME)及所在单位(COMPANY)。

  1. SELECT
  2.         b.NAME,
  3.         b.company
  4. FROM
  5.         test_sql.borrow_log a
  6.         JOIN test_sql.reader b ON a.reader_id = b.reader_id;
复制代码

(6)求”科学出版社”图书的最高单价、最低单价、平均单价。

  1. SELECT
  2.         max( price ),
  3.         min( price ),
  4.         avg( price )
  5. FROM
  6.         test_sql.book
  7. WHERE
  8.         OUTPUT = '科学出版社';
复制代码

(7)找出当前至少借阅了2本图书(大于等于2本)的读者姓名及其所在单位。

  1. SELECT
  2.         b.NAME,
  3.         b.company
  4. FROM
  5.         ( SELECT reader_id FROM test_sql.borrow_log GROUP BY reader_id HAVING count(*) ]= 2 ) a
  6.         JOIN test_sql.reader b ON a.reader_id = b.reader_id;
复制代码

(8)考虑到数据安全的需要,需定时将“借阅记录”中数据进行备份,请使用一条SQL语句,在备份用 户bak下创建与“借阅记录”表结构完全一致的数据表BORROW_LOG_BAK.井且将“借阅记录”中现有 数据全部复制到BORROW_L0G_ BAK中。

  1. CREATE TABLE test_sql.borrow_log_bak AS SELECT
  2. *
  3. FROM
  4.         test_sql.borrow_log;
复制代码

(9)现在需要将原Oracle数据库中数据迁移至Hive仓库,请写出“图书”在Hive中的建表语句(Hive实现,提示:列分隔符|;数据表数据需要外部导入:分区分别以month_part、day_part 命名)

  1. CREATE TABLE book_hive
  2.         ( book_id string, SORT string, book_name string, writer string, OUTPUT string, price DECIMAL ( 10, 2 ) )
  3.         partitioned BY ( month_part string, day_part string )
  4.         ROW format delimited FIELDS TERMINATED BY '\|' stored AS textfile;
复制代码

(10)Hive中有表A,现在需要将表A的月分区 202106 中 user_id为20000的user_dinner字段更新为bonc8920,其他用户user_dinner字段数据不变,请列出更新的方法步骤。(Hive实现,提示:Hlive中无update语法,请通过其他办法进行数据更新)

方式1:配置hive支持事务操作,分桶表,orc存储格式
方式2:第一步找到要更新的数据,将要更改的字段替换为新的值,第二步找到不需要更新的数据,第三步将上两步的数据插入一张新表中。

4、执行结果

(2)

20210708011603360.png

(3)

20210708011816956.png

(4)

20210708012142975.png

(5)

20210708012411384.png

(6)

20210708012545944.png

(7)

20210708013534161.png

(8)

20210708013741725.png

(9)

20210708014224297.png

第八题
  
1、需求

有一个线上服务器访问日志格式如下(用sql答题)

20210708014604917.png

求11月9号下午14点(14-15点),访问/api/user/login接口的top10的ip地址

2、数据准备

  1. CREATE TABLE test_sql.test8 ( `date` string, interface string, ip string );
  2. INSERT INTO TABLE test_sql.test8
  3. VALUES
  4.         ( '2016-11-09 11:22:05', '/api/user/login', '110.23.5.23' );
  5. INSERT INTO TABLE test_sql.test8
  6. VALUES
  7.         ( '2016-11-09 11:23:10', '/api/user/detail', '57.3.2.16' );
  8. INSERT INTO TABLE test_sql.test8
  9. VALUES
  10.         ( '2016-11-09 23:59:40', '/api/user/login', '200.6.5.166' );
  11. INSERT INTO TABLE test_sql.test8
  12. VALUES
  13.         ( '2016-11-09 11:14:23', '/api/user/login', '136.79.47.70' );
  14. INSERT INTO TABLE test_sql.test8
  15. VALUES
  16.         ( '2016-11-09 11:15:23', '/api/user/detail', '94.144.143.141' );
  17. INSERT INTO TABLE test_sql.test8
  18. VALUES
  19.         ( '2016-11-09 11:16:23', '/api/user/login', '197.161.8.206' );
  20. INSERT INTO TABLE test_sql.test8
  21. VALUES
  22.         ( '2016-11-09 12:14:23', '/api/user/detail', '240.227.107.145' );
  23. INSERT INTO TABLE test_sql.test8
  24. VALUES
  25.         ( '2016-11-09 13:14:23', '/api/user/login', '79.130.122.205' );
  26. INSERT INTO TABLE test_sql.test8
  27. VALUES
  28.         ( '2016-11-09 14:14:23', '/api/user/detail', '65.228.251.189' );
  29. INSERT INTO TABLE test_sql.test8
  30. VALUES
  31.         ( '2016-11-09 14:15:23', '/api/user/detail', '245.23.122.44' );
  32. INSERT INTO TABLE test_sql.test8
  33. VALUES
  34.         ( '2016-11-09 14:17:23', '/api/user/detail', '22.74.142.137' );
  35. INSERT INTO TABLE test_sql.test8
  36. VALUES
  37.         ( '2016-11-09 14:19:23', '/api/user/detail', '54.93.212.87' );
  38. INSERT INTO TABLE test_sql.test8
  39. VALUES
  40.         ( '2016-11-09 14:20:23', '/api/user/detail', '218.15.167.248' );
  41. INSERT INTO TABLE test_sql.test8
  42. VALUES
  43.         ( '2016-11-09 14:24:23', '/api/user/detail', '20.117.19.75' );
  44. INSERT INTO TABLE test_sql.test8
  45. VALUES
  46.         ( '2016-11-09 15:14:23', '/api/user/login', '183.162.66.97' );
  47. INSERT INTO TABLE test_sql.test8
  48. VALUES
  49.         ( '2016-11-09 16:14:23', '/api/user/login', '108.181.245.147' );
  50. INSERT INTO TABLE test_sql.test8
  51. VALUES
  52.         ( '2016-11-09 14:17:23', '/api/user/login', '22.74.142.137' );
  53. INSERT INTO TABLE test_sql.test8
  54. VALUES
  55.         ( '2016-11-09 14:19:23', '/api/user/login', '22.74.142.137' );
复制代码

3、查询SQL
  
  1. SELECT
  2.         ip,
  3.         count(*) AS cnt
  4. FROM
  5.         test_sql.test8
  6. WHERE
  7.         date_format( `date`, 'yyyy-MM-dd HH' ) ]= '2016-11-09 14'
  8.         AND date_format( `date`, 'yyyy-MM-dd HH' ) [ '2016-11-09 15'
  9.         AND interface = '/api/user/login'
  10. GROUP BY
  11.         ip
  12. ORDER BY
  13.         cnt DESC
  14.         LIMIT 10;
复制代码

4、执行结果
  
20210708015811891.png

第九题

1、需求

有一个充值日志表credit_log,字段如下:

  1. `dist_id` int   '区组id',
  2. `account` string   '账号',
  3. `money` int   '充值金额',`
  4. create_time` string  '订单时间'
复制代码

请写出SQL语句,查询充值日志表2021年01月02号每个区组下充值额最大的账号,要求

结果:

区组id,账号,金额,充值时间

2、数据准备

  1. CREATE TABLE test_sql.test9 ( dist_id string COMMENT '区组id', account string COMMENT '账号', `money` DECIMAL ( 10, 2 ) COMMENT '充值金额', create_time string COMMENT '订单时间' );
  2. INSERT INTO TABLE test_sql.test9
  3. VALUES
  4.         ( '1', '11', 100006, '2021-01-02 13:00:01' );
  5. INSERT INTO TABLE test_sql.test9
  6. VALUES
  7.         ( '1', '22', 110000, '2021-01-02 13:00:02' );
  8. INSERT INTO TABLE test_sql.test9
  9. VALUES
  10.         ( '1', '33', 102000, '2021-01-02 13:00:03' );
  11. INSERT INTO TABLE test_sql.test9
  12. VALUES
  13.         ( '1', '44', 100300, '2021-01-02 13:00:04' );
  14. INSERT INTO TABLE test_sql.test9
  15. VALUES
  16.         ( '1', '55', 100040, '2021-01-02 13:00:05' );
  17. INSERT INTO TABLE test_sql.test9
  18. VALUES
  19.         ( '1', '66', 100005, '2021-01-02 13:00:06' );
  20. INSERT INTO TABLE test_sql.test9
  21. VALUES
  22.         ( '1', '77', 180000, '2021-01-03 13:00:07' );
  23. INSERT INTO TABLE test_sql.test9
  24. VALUES
  25.         ( '1', '88', 106000, '2021-01-02 13:00:08' );
  26. INSERT INTO TABLE test_sql.test9
  27. VALUES
  28.         ( '1', '99', 100400, '2021-01-02 13:00:09' );
  29. INSERT INTO TABLE test_sql.test9
  30. VALUES
  31.         ( '1', '12', 100030, '2021-01-02 13:00:10' );
  32. INSERT INTO TABLE test_sql.test9
  33. VALUES
  34.         ( '1', '13', 100003, '2021-01-02 13:00:20' );
  35. INSERT INTO TABLE test_sql.test9
  36. VALUES
  37.         ( '1', '14', 100020, '2021-01-02 13:00:30' );
  38. INSERT INTO TABLE test_sql.test9
  39. VALUES
  40.         ( '1', '15', 100500, '2021-01-02 13:00:40' );
  41. INSERT INTO TABLE test_sql.test9
  42. VALUES
  43.         ( '1', '16', 106000, '2021-01-02 13:00:50' );
  44. INSERT INTO TABLE test_sql.test9
  45. VALUES
  46.         ( '1', '17', 100800, '2021-01-02 13:00:59' );
  47. INSERT INTO TABLE test_sql.test9
  48. VALUES
  49.         ( '2', '18', 100800, '2021-01-02 13:00:11' );
  50. INSERT INTO TABLE test_sql.test9
  51. VALUES
  52.         ( '2', '19', 100030, '2021-01-02 13:00:12' );
  53. INSERT INTO TABLE test_sql.test9
  54. VALUES
  55.         ( '2', '10', 100000, '2021-01-02 13:00:13' );
  56. INSERT INTO TABLE test_sql.test9
  57. VALUES
  58.         ( '2', '45', 100010, '2021-01-02 13:00:14' );
  59. INSERT INTO TABLE test_sql.test9
  60. VALUES
  61.         ( '2', '78', 100070, '2021-01-02 13:00:15' );
复制代码

3、查询SQL
  
复制代码

4、执行结果
  
20210708020948458.png

第十题

1、需求

有一个账号表如下,请写出SQL语句,查询各自区组的gold排名前十的账号(分组取前10)

  1. dist_id string   '区组id',
  2. account string   '账号',
  3. gold int   '金币'
复制代码

2、数据准备

  1. CREATE TABLE test_sql.test10 ( `dist_id` string COMMENT '区组id', `account` string COMMENT '账号', `gold` INT COMMENT '金币' );
  2. INSERT INTO TABLE test_sql.test10
  3. VALUES
  4.         ( '1', '77', 18 );
  5. INSERT INTO TABLE test_sql.test10
  6. VALUES
  7.         ( '1', '88', 106 );
  8. INSERT INTO TABLE test_sql.test10
  9. VALUES
  10.         ( '1', '99', 10 );
  11. INSERT INTO TABLE test_sql.test10
  12. VALUES
  13.         ( '1', '12', 13 );
  14. INSERT INTO TABLE test_sql.test10
  15. VALUES
  16.         ( '1', '13', 14 );
  17. INSERT INTO TABLE test_sql.test10
  18. VALUES
  19.         ( '1', '14', 25 );
  20. INSERT INTO TABLE test_sql.test10
  21. VALUES
  22.         ( '1', '15', 36 );
  23. INSERT INTO TABLE test_sql.test10
  24. VALUES
  25.         ( '1', '16', 12 );
  26. INSERT INTO TABLE test_sql.test10
  27. VALUES
  28.         ( '1', '17', 158 );
  29. INSERT INTO TABLE test_sql.test10
  30. VALUES
  31.         ( '2', '18', 12 );
  32. INSERT INTO TABLE test_sql.test10
  33. VALUES
  34.         ( '2', '19', 44 );
  35. INSERT INTO TABLE test_sql.test10
  36. VALUES
  37.         ( '2', '10', 66 );
  38. INSERT INTO TABLE test_sql.test10
  39. VALUES
  40.         ( '2', '45', 80 );
  41. INSERT INTO TABLE test_sql.test10
  42. VALUES
  43.         ( '2', '78', 98 );
复制代码

3、 查询SQL

  1. SELECT
  2.         dist_id,
  3.         account,
  4.         gold
  5. FROM
  6.         ( SELECT dist_id, account, gold, row_number () over ( PARTITION BY dist_id ORDER BY gold DESC ) rank FROM test_sql.test10 ) t
  7. WHERE
  8.         rank [= 10;
复制代码

4、执行结果

20210709011641612.png




最新经典文章,欢迎关注公众号



---------------------





没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条