HiveSQL练习(中级40题,含数据及答案)

第1章 环境准备

1.1 用户信息表

1)表结构

user_id(用户id)

gender(性别)

birthday(生日)

101

1990-01-01

102

1991-02-01

103

1992-03-01

104

1993-04-01

2)建表语句

hive>

DROP TABLE IF EXISTS user_info;

create table user_info(

    `user_id`  string COMMENT '用户id',

    `gender`   string COMMENT '性别',

    `birthday` string COMMENT '生日'

) COMMENT '用户信息表'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

3)数据装载

hive>

insert overwrite table user_info

values ('101', '男', '1990-01-01'),

       ('102', '女', '1991-02-01'),

       ('103', '女', '1992-03-01'),

       ('104', '男', '1993-04-01'),

       ('105', '女', '1994-05-01'),

       ('106', '男', '1995-06-01'),

       ('107', '女', '1996-07-01'),

       ('108', '男', '1997-08-01'),

       ('109', '女', '1998-09-01'),

       ('1010', '男', '1999-10-01');

1.2 商品信息表

1)表结构

sku_id

(商品id)

name

(商品名称)

category_id

(分类id)

from_date

(上架日期)

price

(商品价格)

1

xiaomi 10

1

2020-01-01

2000

6

洗碗机

2

2020-02-01

2000

9

自行车

3

2020-01-01

1000

2)建表语句

hive>

DROP TABLE IF EXISTS sku_info;

CREATE TABLE sku_info(

    `sku_id`      string COMMENT '商品id',

    `name`        string COMMENT '商品名称',

    `category_id` string COMMENT '所属分类id',

    `from_date`   string COMMENT '上架日期',

    `price`       double COMMENT '商品单价'

) COMMENT '商品属性表'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

3)数据装载

hive>

insert overwrite table sku_info

values ('1', 'xiaomi 10', '1', '2020-01-01', 2000),

       ('2', '手机壳', '1', '2020-02-01', 10),

       ('3', 'apple 12', '1', '2020-03-01', 5000),

       ('4', 'xiaomi 13', '1', '2020-04-01', 6000),

       ('5', '破壁机', '2', '2020-01-01', 500),

       ('6', '洗碗机', '2', '2020-02-01', 2000),

       ('7', '热水壶', '2', '2020-03-01', 100),

       ('8', '微波炉', '2', '2020-04-01', 600),

       ('9', '自行车', '3', '2020-01-01', 1000),

       ('10', '帐篷', '3', '2020-02-01', 100),

       ('11', '烧烤架', '3', '2020-02-01', 50),

       ('12', '遮阳伞', '3', '2020-03-01', 20);

1.3 商品分类信息表

1)表结构

category_id(分类id)

category_name(分类名称)

1

数码

2

厨卫

3

户外

2)建表语句

hive>

DROP TABLE IF EXISTS category_info;

create table category_info(

    `category_id`   string,

    `category_name` string

) COMMENT '品类表'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

3)数据装载

hive>

insert overwrite table category_info

values ('1','数码'),

       ('2','厨卫'),

       ('3','户外');

1.4 订单信息表

1)表结构

order_id

(订单id)

user_id

(用户id)

create_date

(下单日期)

total_amount

(订单金额)

1

101

2021-09-30

29000.00

10

103

2020-10-02

28000.00

2)建表语句

hive>

DROP TABLE IF EXISTS order_info;

create table order_info(

    `order_id`     string COMMENT '订单id',

    `user_id`      string COMMENT '用户id',

    `create_date`  string COMMENT '下单日期',

    `total_amount` decimal(16, 2) COMMENT '订单总金额'

) COMMENT '订单表'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

3)数据装载

hive>

insert overwrite table order_info

values ('1', '101', '2021-09-27', 29000.00),

       ('2', '101', '2021-09-28', 70500.00),

       ('3', '101', '2021-09-29', 43300.00),

       ('4', '101', '2021-09-30', 860.00),

       ('5', '102', '2021-10-01', 46180.00),

       ('6', '102', '2021-10-01', 50000.00),

       ('7', '102', '2021-10-01', 75500.00),

       ('8', '102', '2021-10-02', 6170.00),

       ('9', '103', '2021-10-02', 18580.00),

       ('10', '103', '2021-10-02', 28000.00),

       ('11', '103', '2021-10-02', 23400.00),

       ('12', '103', '2021-10-03', 5910.00),

       ('13', '104', '2021-10-03', 13000.00),

       ('14', '104', '2021-10-03', 69500.00),

       ('15', '104', '2021-10-03', 2000.00),

       ('16', '104', '2021-10-03', 5380.00),

       ('17', '105', '2021-10-04', 6210.00),

       ('18', '105', '2021-10-04', 68000.00),

       ('19', '105', '2021-10-04', 43100.00),

       ('20', '105', '2021-10-04', 2790.00),

       ('21', '106', '2021-10-04', 9390.00),

       ('22', '106', '2021-10-05', 58000.00),

       ('23', '106', '2021-10-05', 46600.00),

       ('24', '106', '2021-10-05', 5160.00),

       ('25', '107', '2021-10-05', 55350.00),

       ('26', '107', '2021-10-05', 14500.00),

       ('27', '107', '2021-10-06', 47400.00),

       ('28', '107', '2021-10-06', 6900.00),

       ('29', '108', '2021-10-06', 56570.00),

       ('30', '108', '2021-10-06', 44500.00),

       ('31', '108', '2021-10-07', 50800.00),

       ('32', '108', '2021-10-07', 3900.00),

       ('33', '109', '2021-10-07', 41480.00),

       ('34', '109', '2021-10-07', 88000.00),

       ('35', '109', '2020-10-08', 15000.00),

       ('36', '109', '2020-10-08', 9020.00),

       ('37', '1010', '2020-10-08', 9260.00),

       ('38', '1010', '2020-10-08', 12000.00),

       ('39', '1010', '2020-10-08', 23900.00),

       ('40', '1010', '2020-10-08', 6790.00);

1.5 订单明细表

1)表结构

order_detail_id

(订单明细id)

order_id

(订单id)

sku_id

(商品id)

create_date

(下单日期)

price

(商品单价)

sku_num

(商品件数)

1

1

1

2021-09-30

2000.00

2

2

1

3

2021-09-30

5000.00

5

22

10

4

2020-10-02

6000.00

1

23

10

5

2020-10-02

500.00

24

24

10

6

2020-10-02

2000.00

5

2)建表语句

hive>

DROP TABLE IF EXISTS order_detail;

CREATE TABLE order_detail

(

    `order_detail_id` string COMMENT '订单明细id',

    `order_id`        string COMMENT '订单id',

    `sku_id`          string COMMENT '商品id',

    `create_date`     string COMMENT '下单日期',

    `price`           decimal(16, 2) COMMENT '下单时的商品单价',

    `sku_num`         int COMMENT '下单商品件数'

) COMMENT '订单明细表'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

3)数据装载

hive>

INSERT overwrite table order_detail

values ('1', '1', '1', '2021-09-27', 2000.00, 2),

       ('2', '1', '3', '2021-09-27', 5000.00, 5),

       ('3', '2', '4', '2021-09-28', 6000.00, 9),

       ('4', '2', '5', '2021-09-28', 500.00, 33),

       ('5', '3', '7', '2021-09-29', 100.00, 37),

       ('6', '3', '8', '2021-09-29', 600.00, 46),

       ('7', '3', '9', '2021-09-29', 1000.00, 12),

       ('8', '4', '12', '2021-09-30', 20.00, 43),

       ('9', '5', '1', '2021-10-01', 2000.00, 8),

       ('10', '5', '2', '2021-10-01', 10.00, 18),

       ('11', '5', '3', '2021-10-01', 5000.00, 6),

       ('12', '6', '4', '2021-10-01', 6000.00, 8),

       ('13', '6', '6', '2021-10-01', 2000.00, 1),

       ('14', '7', '7', '2021-10-01', 100.00, 17),

       ('15', '7', '8', '2021-10-01', 600.00, 48),

       ('16', '7', '9', '2021-10-01', 1000.00, 45),

       ('17', '8', '10', '2021-10-02', 100.00, 48),

       ('18', '8', '11', '2021-10-02', 50.00, 15),

       ('19', '8', '12', '2021-10-02', 20.00, 31),

       ('20', '9', '1', '2021-09-30', 2000.00, 9),

       ('21', '9', '2', '2021-10-02', 10.00, 5800),

       ('22', '10', '4', '2021-10-02', 6000.00, 1),

       ('23', '10', '5', '2021-10-02', 500.00, 24),

       ('24', '10', '6', '2021-10-02', 2000.00, 5),

       ('25', '11', '8', '2021-10-02', 600.00, 39),

       ('26', '12', '10', '2021-10-03', 100.00, 47),

       ('27', '12', '11', '2021-10-03', 50.00, 19),

       ('28', '12', '12', '2021-10-03', 20.00, 13000),

       ('29', '13', '1', '2021-10-03', 2000.00, 4),

       ('30', '13', '3', '2021-10-03', 5000.00, 1),

       ('31', '14', '4', '2021-10-03', 6000.00, 5),

       ('32', '14', '5', '2021-10-03', 500.00, 47),

       ('33', '14', '6', '2021-10-03', 2000.00, 8),

       ('34', '15', '7', '2021-10-03', 100.00, 20),

       ('35', '16', '10', '2021-10-03', 100.00, 22),

       ('36', '16', '11', '2021-10-03', 50.00, 42),

       ('37', '16', '12', '2021-10-03', 20.00, 7400),

       ('38', '17', '1', '2021-10-04', 2000.00, 3),

       ('39', '17', '2', '2021-10-04', 10.00, 21),

       ('40', '18', '4', '2021-10-04', 6000.00, 8),

       ('41', '18', '5', '2021-10-04', 500.00, 28),

       ('42', '18', '6', '2021-10-04', 2000.00, 3),

       ('43', '19', '7', '2021-10-04', 100.00, 55),

       ('44', '19', '8', '2021-10-04', 600.00, 11),

       ('45', '19', '9', '2021-10-04', 1000.00, 31),

       ('46', '20', '11', '2021-10-04', 50.00, 45),

       ('47', '20', '12', '2021-10-04', 20.00, 27),

       ('48', '21', '1', '2021-10-04', 2000.00, 2),

       ('49', '21', '2', '2021-10-04', 10.00, 39),

       ('50', '21', '3', '2021-10-04', 5000.00, 1),

       ('51', '22', '4', '2021-10-05', 6000.00, 8),

       ('52', '22', '5', '2021-10-05', 500.00, 20),

       ('53', '23', '7', '2021-10-05', 100.00, 58),

       ('54', '23', '8', '2021-10-05', 600.00, 18),

       ('55', '23', '9', '2021-10-05', 1000.00, 30),

       ('56', '24', '10', '2021-10-05', 100.00, 27),

       ('57', '24', '11', '2021-10-05', 50.00, 28),

       ('58', '24', '12', '2021-10-05', 20.00, 53),

       ('59', '25', '1', '2021-10-05', 2000.00, 5),

       ('60', '25', '2', '2021-10-05', 10.00, 35),

       ('61', '25', '3', '2021-10-05', 5000.00, 9),

       ('62', '26', '4', '2021-10-05', 6000.00, 1),

       ('63', '26', '5', '2021-10-05', 500.00, 13),

       ('64', '26', '6', '2021-10-05', 2000.00, 1),

       ('65', '27', '7', '2021-10-06', 100.00, 30),

       ('66', '27', '8', '2021-10-06', 600.00, 19),

       ('67', '27', '9', '2021-10-06', 1000.00, 33),

       ('68', '28', '10', '2021-10-06', 100.00, 37),

       ('69', '28', '11', '2021-10-06', 50.00, 46),

       ('70', '28', '12', '2021-10-06', 20.00, 45),

       ('71', '29', '1', '2021-10-06', 2000.00, 8),

       ('72', '29', '2', '2021-10-06', 10.00, 57),

       ('73', '29', '3', '2021-10-06', 5000.00, 8),

       ('74', '30', '4', '2021-10-06', 6000.00, 3),

       ('75', '30', '5', '2021-10-06', 500.00, 33),

       ('76', '30', '6', '2021-10-06', 2000.00, 5),

       ('77', '31', '8', '2021-10-07', 600.00, 13),

       ('78', '31', '9', '2021-10-07', 1000.00, 43),

       ('79', '32', '10', '2021-10-07', 100.00, 24),

       ('80', '32', '11', '2021-10-07', 50.00, 30),

       ('81', '33', '1', '2021-10-07', 2000.00, 8),

       ('82', '33', '2', '2021-10-07', 10.00, 48),

       ('83', '33', '3', '2021-10-07', 5000.00, 5),

       ('84', '34', '4', '2021-10-07', 6000.00, 10),

       ('85', '34', '5', '2021-10-07', 500.00, 44),

       ('86', '34', '6', '2021-10-07', 2000.00, 3),

       ('87', '35', '8', '2020-10-08', 600.00, 25),

       ('88', '36', '10', '2020-10-08', 100.00, 57),

       ('89', '36', '11', '2020-10-08', 50.00, 44),

       ('90', '36', '12', '2020-10-08', 20.00, 56),

       ('91', '37', '1', '2020-10-08', 2000.00, 2),

       ('92', '37', '2', '2020-10-08', 10.00, 26),

       ('93', '37', '3', '2020-10-08', 5000.00, 1),

       ('94', '38', '6', '2020-10-08', 2000.00, 6),

       ('95', '39', '7', '2020-10-08', 100.00, 35),

       ('96', '39', '8', '2020-10-08', 600.00, 34),

       ('97', '40', '10', '2020-10-08', 100.00, 37),

       ('98', '40', '11', '2020-10-08', 50.00, 51),

       ('99', '40', '12', '2020-10-08', 20.00, 27);

1.6 登录明细表

1)表结构

user_id(用户id)

ip_address(ip地址)

login_ts(登录时间)

logout_ts(登出时间)

101

180.149.130.161

2021-09-21 08:00:00

2021-09-27 08:30:00

102

120.245.11.2

2021-09-22 09:00:00

2021-09-27 09:30:00

103

27.184.97.3

2021-09-23 10:00:00

2021-09-27 10:30:00

2)建表语句

hive>

DROP TABLE IF EXISTS user_login_detail;

CREATE TABLE user_login_detail

(

    `user_id`    string comment '用户id',

    `ip_address` string comment 'ip地址',

    `login_ts`   string comment '登录时间',

    `logout_ts`  string comment '登出时间'

) COMMENT '用户登录明细表'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

3)数据装载

hive>

INSERT overwrite table user_login_detail

VALUES ('101', '180.149.130.161', '2021-09-21 08:00:00', '2021-09-27 08:30:00'),

       ('101', '180.149.130.161', '2021-09-27 08:00:00', '2021-09-27 08:30:00'),

       ('101', '180.149.130.161', '2021-09-28 09:00:00', '2021-09-28 09:10:00'),

       ('101', '180.149.130.161', '2021-09-29 13:30:00', '2021-09-29 13:50:00'),

       ('101', '180.149.130.161', '2021-09-30 20:00:00', '2021-09-30 20:10:00'),

       ('102', '120.245.11.2', '2021-09-22 09:00:00', '2021-09-27 09:30:00'),

       ('102', '120.245.11.2', '2021-10-01 08:00:00', '2021-10-01 08:30:00'),

       ('102', '180.149.130.174', '2021-10-01 07:50:00', '2021-10-01 08:20:00'),

       ('102', '120.245.11.2', '2021-10-02 08:00:00', '2021-10-02 08:30:00'),

       ('103', '27.184.97.3', '2021-09-23 10:00:00', '2021-09-27 10:30:00'),

       ('103', '27.184.97.3', '2021-10-03 07:50:00', '2021-10-03 09:20:00'),

       ('104', '27.184.97.34', '2021-09-24 11:00:00', '2021-09-27 11:30:00'),

       ('104', '27.184.97.34', '2021-10-03 07:50:00', '2021-10-03 08:20:00'),

       ('104', '27.184.97.34', '2021-10-03 08:50:00', '2021-10-03 10:20:00'),

       ('104', '120.245.11.89', '2021-10-03 08:40:00', '2021-10-03 10:30:00'),

       ('105', '119.180.192.212', '2021-10-04 09:10:00', '2021-10-04 09:30:00'),

       ('106', '119.180.192.66', '2021-10-04 08:40:00', '2021-10-04 10:30:00'),

       ('106', '119.180.192.66', '2021-10-05 21:50:00', '2021-10-05 22:40:00'),

       ('107', '219.134.104.7', '2021-09-25 12:00:00', '2021-09-27 12:30:00'),

       ('107', '219.134.104.7', '2021-10-05 22:00:00', '2021-10-05 23:00:00'),

       ('107', '219.134.104.7', '2021-10-06 09:10:00', '2021-10-06 10:20:00'),

       ('107', '27.184.97.46', '2021-10-06 09:00:00', '2021-10-06 10:00:00'),

       ('108', '101.227.131.22', '2021-10-06 09:00:00', '2021-10-06 10:00:00'),

       ('108', '101.227.131.22', '2021-10-06 22:00:00', '2021-10-06 23:00:00'),

       ('109', '101.227.131.29', '2021-09-26 13:00:00', '2021-09-27 13:30:00'),

       ('109', '101.227.131.29', '2021-10-06 08:50:00', '2021-10-06 10:20:00'),

       ('109', '101.227.131.29', '2021-10-08 09:00:00', '2021-10-08 09:10:00'),

       ('1010', '119.180.192.10', '2021-09-27 14:00:00', '2021-09-27 14:30:00'),

       ('1010', '119.180.192.10', '2021-10-09 08:50:00', '2021-10-09 10:20:00');

1.7 商品价格变更明细表

1)表结构

sku_id(商品id)

new_price(本次变更之后的价格)

change_date(变更日期)

1

1900.00

2021-09-25

1

2000.00

2021-09-26

2

80.00

2021-09-29

2

10.00

2021-09-30

2)建表语句

hive>

DROP TABLE IF EXISTS sku_price_modify_detail;

CREATE TABLE sku_price_modify_detail

(

    `sku_id`      string comment '商品id',

    `new_price`   decimal(16, 2) comment '更改后的价格',

    `change_date` string comment '变动日期'

) COMMENT '商品价格变更明细表'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

3)数据装载

hive>

insert overwrite table sku_price_modify_detail

values ('1', 1900, '2021-09-25'),

       ('1', 2000, '2021-09-26'),

       ('2', 80, '2021-09-29'),

       ('2', 10, '2021-09-30'),

       ('3', 4999, '2021-09-25'),

       ('3', 5000, '2021-09-26'),

       ('4', 5600, '2021-09-26'),

       ('4', 6000, '2021-09-27'),

       ('5', 490, '2021-09-27'),

       ('5', 500, '2021-09-28'),

       ('6', 1988, '2021-09-30'),

       ('6', 2000, '2021-10-01'),

       ('7', 88, '2021-09-28'),

       ('7', 100, '2021-09-29'),

       ('8', 800, '2021-09-28'),

       ('8', 600, '2021-09-29'),

       ('9', 1100, '2021-09-27'),

       ('9', 1000, '2021-09-28'),

       ('10', 90, '2021-10-01'),

       ('10', 100, '2021-10-02'),

       ('11', 66, '2021-10-01'),

       ('11', 50, '2021-10-02'),

       ('12', 35, '2021-09-28'),

       ('12', 20, '2021-09-29');

1.8 配送信息表

1)表结构

delivery_id

(运单id

order_id

(订单id

user_id

(用户id

order_date

(下单日期)

custom_date

(期望配送日期)

1

1

101

2021-09-27

2021-09-29

2

2

101

2021-09-28

2021-09-28

3

3

101

2021-09-29

2021-09-30

2)建表语句

hive>

DROP TABLE IF EXISTS delivery_info;

CREATE TABLE delivery_info

(

    `delivery_id` string comment '配送单id',

    `order_id`    string comment '订单id',

    `user_id`     string comment '用户id',

    `order_date`  string comment '下单日期',

    `custom_date` string comment '期望配送日期'

) COMMENT '邮寄信息表'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

3)数据装载

hive>

insert overwrite table delivery_info

values ('1', '1', '101', '2021-09-27', '2021-09-29'),

       ('2', '2', '101', '2021-09-28', '2021-09-28'),

       ('3', '3', '101', '2021-09-29', '2021-09-30'),

       ('4', '4', '101', '2021-09-30', '2021-10-01'),

       ('5', '5', '102', '2021-10-01', '2021-10-01'),

       ('6', '6', '102', '2021-10-01', '2021-10-01'),

       ('7', '7', '102', '2021-10-01', '2021-10-03'),

       ('8', '8', '102', '2021-10-02', '2021-10-02'),

       ('9', '9', '103', '2021-10-02', '2021-10-03'),

       ('10', '10', '103', '2021-10-02', '2021-10-04'),

       ('11', '11', '103', '2021-10-02', '2021-10-02'),

       ('12', '12', '103', '2021-10-03', '2021-10-03'),

       ('13', '13', '104', '2021-10-03', '2021-10-04'),

       ('14', '14', '104', '2021-10-03', '2021-10-04'),

       ('15', '15', '104', '2021-10-03', '2021-10-03'),

       ('16', '16', '104', '2021-10-03', '2021-10-03'),

       ('17', '17', '105', '2021-10-04', '2021-10-04'),

       ('18', '18', '105', '2021-10-04', '2021-10-06'),

       ('19', '19', '105', '2021-10-04', '2021-10-06'),

       ('20', '20', '105', '2021-10-04', '2021-10-04'),

       ('21', '21', '106', '2021-10-04', '2021-10-04'),

       ('22', '22', '106', '2021-10-05', '2021-10-05'),

       ('23', '23', '106', '2021-10-05', '2021-10-05'),

       ('24', '24', '106', '2021-10-05', '2021-10-07'),

       ('25', '25', '107', '2021-10-05', '2021-10-05'),

       ('26', '26', '107', '2021-10-05', '2021-10-06'),

       ('27', '27', '107', '2021-10-06', '2021-10-06'),

       ('28', '28', '107', '2021-10-06', '2021-10-07'),

       ('29', '29', '108', '2021-10-06', '2021-10-06'),

       ('30', '30', '108', '2021-10-06', '2021-10-06'),

       ('31', '31', '108', '2021-10-07', '2021-10-09'),

       ('32', '32', '108', '2021-10-07', '2021-10-09'),

       ('33', '33', '109', '2021-10-07', '2021-10-08'),

       ('34', '34', '109', '2021-10-07', '2021-10-08'),

       ('35', '35', '109', '2021-10-08', '2021-10-10'),

       ('36', '36', '109', '2021-10-08', '2021-10-09'),

       ('37', '37', '1010', '2021-10-08', '2021-10-10'),

       ('38', '38', '1010', '2021-10-08', '2021-10-10'),

       ('39', '39', '1010', '2021-10-08', '2021-10-09'),

       ('40', '40', '1010', '2021-10-08', '2021-10-09');

1.9 好友关系表 

1)表结构

user1_id(用户1 id

user2_id(用户2 id

101

1010

101

108

101

106

注:表中一行数据中的两个user_id,表示两个用户互为好友。

2)建表语句

hive>

DROP TABLE IF EXISTS friendship_info;

CREATE TABLE friendship_info(

    `user1_id` string comment '用户1id',

    `user2_id` string comment '用户2id'

) COMMENT '用户关系表'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

3)数据装载

hive>

insert overwrite table friendship_info

values ('101', '1010'),

       ('101', '108'),

       ('101', '106'),

       ('101', '104'),

       ('101', '102'),

       ('102', '1010'),

       ('102', '108'),

       ('102', '106'),

       ('102', '104'),

       ('102', '102'),

       ('103', '1010'),

       ('103', '108'),

       ('103', '106'),

       ('103', '104'),

       ('103', '102'),

       ('104', '1010'),

       ('104', '108'),

       ('104', '106'),

       ('104', '104'),

       ('104', '102'),

       ('105', '1010'),

       ('105', '108'),

       ('105', '106'),

       ('105', '104'),

       ('105', '102'),

       ('106', '1010'),

       ('106', '108'),

       ('106', '106'),

       ('106', '104'),

       ('106', '102'),

       ('107', '1010'),

       ('107', '108'),

       ('107', '106'),

       ('107', '104'),

       ('107', '102'),

       ('108', '1010'),

       ('108', '108'),

       ('108', '106'),

       ('108', '104'),

       ('108', '102'),

       ('109', '1010'),

       ('109', '108'),

       ('109', '106'),

       ('109', '104'),

       ('109', '102'),

       ('1010', '1010'),

       ('1010', '108'),

       ('1010', '106'),

       ('1010', '104'),

       ('1010', '102');

1.10 收藏信息表

1)表结构

user_id(用户id)

sku_id(商品id)

create_date(收藏日期)

101

3

2021-09-23

101

12

2021-09-23

101

6

2021-09-25

2)建表语句

hive>

DROP TABLE IF EXISTS favor_info;

CREATE TABLE favor_info

(

    `user_id`     string comment '用户id',

    `sku_id`      string comment '商品id',

    `create_date` string comment '收藏日期'

) COMMENT '用户收藏表'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

3)数据装载

hive>

insert overwrite table favor_info

values ('101', '3', '2021-09-23'),

       ('101', '12', '2021-09-23'),

       ('101', '6', '2021-09-25'),

       ('101', '10', '2021-09-21'),

       ('101', '5', '2021-09-25'),

       ('102', '1', '2021-09-24'),

       ('102', '2', '2021-09-24'),

       ('102', '8', '2021-09-23'),

       ('102', '12', '2021-09-22'),

       ('102', '11', '2021-09-23'),

       ('102', '9', '2021-09-25'),

       ('102', '4', '2021-09-25'),

       ('102', '6', '2021-09-23'),

       ('102', '7', '2021-09-26'),

       ('103', '8', '2021-09-24'),

       ('103', '5', '2021-09-25'),

       ('103', '6', '2021-09-26'),

       ('103', '12', '2021-09-27'),

       ('103', '7', '2021-09-25'),

       ('103', '10', '2021-09-25'),

       ('103', '4', '2021-09-24'),

       ('103', '11', '2021-09-25'),

       ('103', '3', '2021-09-27'),

       ('104', '9', '2021-09-28'),

       ('104', '7', '2021-09-28'),

       ('104', '8', '2021-09-25'),

       ('104', '3', '2021-09-28'),

       ('104', '11', '2021-09-25'),

       ('104', '6', '2021-09-25'),

       ('104', '12', '2021-09-28'),

       ('105', '8', '2021-10-08'),

       ('105', '9', '2021-10-07'),

       ('105', '7', '2021-10-07'),

       ('105', '11', '2021-10-06'),

       ('105', '5', '2021-10-07'),

       ('105', '4', '2021-10-05'),

       ('105', '10', '2021-10-07'),

       ('106', '12', '2021-10-08'),

       ('106', '1', '2021-10-08'),

       ('106', '4', '2021-10-04'),

       ('106', '5', '2021-10-08'),

       ('106', '2', '2021-10-04'),

       ('106', '6', '2021-10-04'),

       ('106', '7', '2021-10-08'),

       ('107', '5', '2021-09-29'),

       ('107', '3', '2021-09-28'),

       ('107', '10', '2021-09-27'),

       ('108', '9', '2021-10-08'),

       ('108', '3', '2021-10-10'),

       ('108', '8', '2021-10-10'),

       ('108', '10', '2021-10-07'),

       ('108', '11', '2021-10-07'),

       ('109', '2', '2021-09-27'),

       ('109', '4', '2021-09-29'),

       ('109', '5', '2021-09-29'),

       ('109', '9', '2021-09-30'),

       ('109', '8', '2021-09-26'),

       ('1010', '2', '2021-09-29'),

       ('1010', '9', '2021-09-29'),

       ('1010', '1', '2021-10-01');

建表语句及插入语句汇总

2.1 [课堂讲解]查询累积销量排名第二的商品

2.1.1 题目需求

查询订单明细表(order_detail)中销量(下单件数)排名第二的商品id,如果不存在返回null,如果存在多个排名第二的商品则需要全部返回。期望结果如下:

sku_id

11

2.1.2 代码实现

hive>

select sku_id

from (

         select sku_id

         from (

                  select sku_id,

                         order_num,

                         dense_rank() over (order by order_num desc) rk

                  from (

                           select sku_id,

                                  sum(sku_num) order_num

                           from order_detail

                           group by sku_id

                       ) t1

              ) t2

         where rk = 2

     ) t3

         right join --为保证,没有第二名的情况下,返回null

     (

         select 1

     ) t4

     on 1 = 1;

2.2 [课堂讲解]查询至少连续三天下单的用户

2.2.1 题目需求

查询订单信息表(order_info)中最少连续3天下单的用户id,期望结果如下:

user_id

101

2.2.2 代码实现

hive>

select distinct user_id

from (

         select user_id

         from (

                  select user_id

                       , create_date

                       , date_sub(create_date, row_number() over (partition by user_id order by create_date)) flag

                  from (

                           select user_id

                                , create_date

                           from order_info

                           group by user_id, create_date

                       ) t1 -- 同一天可能多个用户下单,进行去重

              ) t2 -- 判断一串日期是否连续:若连续,用这个日期减去它的排名,会得到一个相同的结果

         group by user_id, flag

         having count(flag) >= 3 -- 连续下单大于等于三天

     ) t3;

2.3 [课堂讲解]查询各品类销售商品的种类数及销量最高的商品

2.3.1 题目需求

从订单明细表(order_detail)统计各品类销售出的商品种类数及累积销量最好的商品,期望结果如下:

category_id

(分类id)

category_name

(分类名称)

sku_id

(销量最好的商品id)

name

(商品名称)

order_num

(销量最好的商品销量

order_cnt

(商品种类数量)

1

数码

2

手机壳

302

4

2

厨卫

8

微波炉

253

4

3

户外

12

遮阳伞

349

4

2.3.2 代码实现

hive>

select category_id,

       category_name,

       sku_id,

       name,

       order_num,

       sku_cnt

from (

         select od.sku_id,

                sku.name,

                sku.category_id,

                cate.category_name,

                order_num,

                rank() over (partition by sku.category_id order by order_num desc) rk,

                count(distinct od.sku_id) over (partition by sku.category_id)      sku_cnt

         from (

                  select sku_id,

                         sum(sku_num) order_num

                  from order_detail

                  group by sku_id

              ) od

                  left join

              sku_info sku

              on od.sku_id = sku.sku_id

                  left join

              category_info cate

              on sku.category_id = cate.category_id

     ) t1

where rk = 1;

2.4 [课堂讲解]查询用户的累计消费金额及VIP等级

2.4.1 题目需求

从订单信息表(order_info)中统计每个用户截止其每个下单日期的累积消费金额,以及每个用户在其每个下单日期的VIP等级。

用户vip等级根据累积消费金额计算,计算规则如下:

设累积消费总额为X,

若0=<X<10000,则vip等级为普通会员

若10000<=X<30000,则vip等级为青铜会员

若30000<=X<50000,则vip等级为白银会员

若50000<=X<80000,则vip为黄金会员

若80000<=X<100000,则vip等级为白金会员

若X>=100000,则vip等级为钻石会员

期望结果如下:

user_id

(用户id)

create_date

(下单日期)

sum_so_far

(截至每个下单日期的累计下单金额)

vip_level

(每个下单日期的VIP等级)

101

2021-09-27

29000.00

青铜会员

101

2021-09-28

99500.00

白金会员

101

2021-09-29

142800.00

钻石会员

101

2021-09-30

143660.00

钻石会员

102

2021-10-01

171680.00

钻石会员

102

2021-10-02

177850.00

钻石会员

103

2021-10-02

69980.00

黄金会员

103

2021-10-03

75890.00

黄金会员

104

2021-10-03

89880.00

白金会员

105

2021-10-04

120100.00

钻石会员

106

2021-10-04

9390.00

普通会员

106

2021-10-05

119150.00

钻石会员

107

2021-10-05

69850.00

黄金会员

107

2021-10-06

124150.00

钻石会员

108

2021-10-06

101070.00

钻石会员

108

2021-10-07

155770.00

钻石会员

109

2021-10-07

129480.00

钻石会员

109

2021-10-08

153500.00

钻石会员

1010

2021-10-08

51950.00

黄金会员

2.4.2 代码实现

hive>

select user_id,

       create_date,

       sum_so_far,

       case

           when sum_so_far >= 100000 then '钻石会员'

           when sum_so_far >= 80000 then '白金会员'

           when sum_so_far >= 50000 then '黄金会员'

           when sum_so_far >= 30000 then '白银会员'

           when sum_so_far >= 10000 then '青铜会员'

           when sum_so_far >= 0 then '普通会员'

           end vip_level

from (

         select user_id,

                create_date,

                sum(total_amount_per_day) over (partition by user_id order by create_date) sum_so_far

         from (

                  select user_id,

                         create_date,

                         sum(total_amount) total_amount_per_day

                  from order_info

                  group by user_id, create_date

              ) t1

     ) t2;

2.5 [课堂讲解]查询首次下单后第二天连续下单的用户比率

2.5.1 题目需求

从订单信息表(order_info)中查询首次下单后第二天仍然下单的用户占所有下单用户的比例,结果保留一位小数,使用百分数显示,期望结果如下:

percentage

70.0%

2.5.2 代码实现

hive>

select concat(round(sum(if(datediff(buy_date_second, buy_date_first) = 1, 1, 0)) / count(*) * 100, 1), '%') percentage

from (

         select user_id,

                min(create_date) buy_date_first,

                max(create_date) buy_date_second

         from (

                  select user_id,

                         create_date,

                         rank() over (partition by user_id order by create_date) rk

                  from (

                           select user_id,

                                  create_date

                           from order_info

                           group by user_id, create_date

                       ) t1

              ) t2

         where rk <= 2

         group by user_id

     ) t3;

2.6 每个商品销售首年的年份、销售数量和销售金额

2.6.1 题目需求

从订单明细表(order_detail)统计每个商品销售首年的年份,销售数量和销售总额。

期望结果如下:

sku_id

(商品id)

year

销售首年年份

order_num

首年销量

order_amount

首年销售金额

1

2021

51

102000.00

2

2021

302

3020.00

3

2021

36

180000.00

4

2021

53

318000.00

5

2021

242

121000.00

6

2021

32

64000.00

7

2021

252

25200.00

8

2021

253

151800.00

9

2021

194

194000.00

10

2021

299

29900.00

11

2021

320

16000.00

12

2021

349

6980.00

2.6.2 代码实现

hive>

select sku_id,

       year(create_date),

       sum(sku_num),

       sum(price*sku_num)

from (

         select order_id,

                sku_id,

                price,

                sku_num,

                create_date,

                rank() over (partition by sku_id order by year(create_date)) rk

         from order_detail

     ) t1

where rk = 1

group by sku_id,year(create_date);

2.7 筛选去年总销量小于100的商品

2.7.1 题目需求

从订单明细表(order_detail)中筛选出去年总销量小于100的商品及其销量,假设今天的日期是2022-01-10,不考虑上架时间小于一个月的商品,期望结果如下:

sku_id

(商品id)

name

(商品名称)

order_num

(销量)

1

xiaomi 10

51

3

apple 12

36

4

xiaomi 13

53

6

洗碗机

32

2.7.2 代码实现

hive>

select t1.sku_id,

       name,

       order_num

from (

         select sku_id,

                sum(sku_num) order_num

         from order_detail

         where year(create_date) = '2021'

           and sku_id in (

             select sku_id

             from sku_info

             where datediff('2022-01-10', from_date) > 30

         )

         group by sku_id

         having sum(sku_num) < 100

     ) t1

         left join

     sku_info t2

     on t1.sku_id = t2.sku_id;

2.8 查询每日新用户数

2.8.1 题目需求

从用户登录明细表(user_login_detail)中查询每天的新增用户数,若一个用户在某天登录了,且在这一天之前没登录过,则任务该用户为这一天的新增用户。期望结果如下:

login_date_first(日期)

user_count(新增用户数)

2021-09-21

1

2021-09-22

1

2021-09-23

1

2021-09-24

1

2021-09-25

1

2021-09-26

1

2021-09-27

1

2021-10-04

2

2021-10-06

1

2.8.2 代码实现

hive>

select

    login_date_first,

    count(*) user_count

from

(

    select

        user_id,

        min(date_format(login_ts,'yyyy-MM-dd')) login_date_first

    from user_login_detail

    group by user_id

)t1

group by login_date_first;

2.9 统计每个商品的销量最高的日期

2.9.1 题目需求

从订单明细表(order_detail)中统计出每种商品销售件数最多的日期及当日销量,如果有同一商品多日销量并列的情况,取其中的最小日期。期望结果如下:

sku_id(商品id)

create_date(销量最高的日期)

sum_num(销量)

1

2021-10-02

9

2

2021-10-04

60

3

2021-10-05

9

4

2021-10-07

10

5

2021-10-03

47

6

2021-10-03

8

7

2021-10-05

58

8

2021-10-08

59

9

2021-10-01

45

10

2021-10-08

94

11

2021-10-08

95

12

2021-10-08

83

2.9.2 代码实现

hive>

select sku_id,

       create_date,

       sum_num

from (

         select sku_id,

                create_date,

                sum_num,

                row_number() over (partition by sku_id order by sum_num desc,create_date asc) rn

         from (

                  select sku_id,

                         create_date,

                         sum(sku_num) sum_num

                  from order_detail

                  group by sku_id, create_date

              ) t1

     ) t2

where rn = 1;

2.10 查询销售件数高于品类平均数的商品

2.10.1 题目需求

从订单明细表(order_detail)中查询累积销售件数高于其所属品类平均数的商品,期望结果如下:

sku_id

name

sum_num

cate_avg_num

2

手机壳

302

110.5

5

破壁机

242

194.75

7

热水壶

252

194.75

8

微波炉

253

194.75

10

帐篷

299

290.5

11

烧烤架

320

290.5

12

遮阳伞

349

290.5

2.10.2 代码实现

hive>

select sku_id,

       name,

       sum_num,

       cate_avg_num

from (

         select od.sku_id,

                category_id,

                name,

                sum_num,

                avg(sum_num) over (partition by category_id) cate_avg_num

         from (

                  select sku_id,

                         sum(sku_num) sum_num

                  from order_detail

                  group by sku_id

              ) od

                  left join

              (

                  select sku_id,

                         name,

                         category_id

                  from sku_info

              ) sku

              on od.sku_id = sku.sku_id) t1

where sum_num > cate_avg_num;

2.11 用户注册、登录、下单综合统计

2.11.1 题目需求

从用户登录明细表(user_login_detail)和订单信息表(order_info)中查询每个用户的注册日期(首次登录日期)、总登录次数以及其在2021年的登录次数、订单数和订单总额。期望结果如下:

user_id

(用户id)

register_date

(注册日期)

total_login_count

(累积登录次数)

login_count_2021

(2021年登录次数)

order_count_2021

(2021年下单次数)

order_amount_2021

(2021年订单金额)

101

2021-09-21

5

5

4

143660.00

102

2021-09-22

4

4

4

177850.00

103

2021-09-23

2

2

4

75890.00

104

2021-09-24

4

4

4

89880.00

105

2021-10-04

1

1

4

120100.00

106

2021-10-04

2

2

4

119150.00

107

2021-09-25

4

4

4

124150.00

108

2021-10-06

2

2

4

155770.00

109

2021-09-26

3

3

4

153500.00

1010

2021-09-27

2

2

4

51950.00

2.11.2 代码实现

hive>

select login.user_id,

       register_date,

       total_login_count,

       login_count_2021,

       order_count_2021,

       order_amount_2021

from (

         select user_id,

                min(date_format(login_ts, 'yyyy-MM-dd'))    register_date,

                count(1)                                    total_login_count,

                count(if(year(login_ts) = '2021', 1, null)) login_count_2021

         from user_login_detail

         group by user_id

     ) login

         join

     (

         select user_id,

                count(distinct(order_id))          order_count_2021,

                sum(total_amount) order_amount_2021

         from order_info

         where year(create_date) = '2021'

         group by user_id

     ) oi

     on login.user_id = oi.user_id;

2.12 查询指定日期的全部商品价格

2.12.1 题目需求

从商品价格修改明细表(sku_price_modify_detail)中查询2021-10-01的全部商品的价格,假设所有商品初始价格默认都是99。期望结果如下:

sku_id(商品id)

price(商品价格)

1

2000.00

2

10.00

3

5000.00

4

6000.00

5

500.00

6

2000.00

7

100.00

8

600.00

9

1000.00

10

90.00

11

66.00

12

20.00

2.12.2 代码实现

hive>

select sku_info.sku_id,

       nvl(new_price, 99) price

from sku_info

         left join

     (

         select sku_id,

                new_price

         from (

                  select sku_id,

                         new_price,

                         change_date,

                         row_number() over (partition by sku_id order by change_date desc) rn

                  from sku_price_modify_detail

                  where change_date <= '2021-10-01'

              ) t1

         where rn = 1

     ) t2

     on sku_info.sku_id = t2.sku_id;

2.13 即时订单比例

2.13.1 题目需求

订单配送中,如果期望配送日期和下单日期相同,称为即时订单,如果期望配送日期和下单日期不同,称为计划订单。

请从配送信息表(delivery_info)中求出每个用户的首单(用户的第一个订单)中即时订单的比例,保留两位小数,以小数形式显示。期望结果如下:

percentage

0.5

2.13.2 代码实现

hive>

select

    round(sum(if(order_date=custom_date,1,0))/count(*),2) percentage

from

(

    select

        delivery_id,

        user_id,

        order_date,

        custom_date,

        row_number() over (partition by user_id order by order_date) rn

    from delivery_info

)t1

where rn=1;

2.14 向用户推荐朋友收藏的商品

2.14.1 题目需求

现需要请向所有用户推荐其朋友收藏但是用户自己未收藏的商品,请从好友关系表(friendship_info)和收藏表(favor_info)中查询出应向哪位用户推荐哪些商品。期望结果如下:

1)部分结果展示

user_id用户id

sku_id(应向该用户推荐的商品id

101

2

101

4

101

7

101

9

101

8

101

11

101

1

2)完整结果

user_id sku_id

101 2

101 4

101 7

101 9

101 8

101 11

101 1

102 3

102 5

102 10

103 2

103 1

103 9

104 1

104 4

104 10

104 5

104 2

105 1

105 2

105 6

105 12

105 3

106 11

106 10

106 8

106 9

106 3

107 11

107 7

107 4

107 9

107 12

107 1

107 8

107 6

107 2

108 2

108 6

108 12

108 1

108 7

108 4

108 5

109 6

109 10

109 7

109 1

109 12

109 3

109 11

1010 4

1010 10

1010 6

1010 12

1010 11

1010 8

1010 3

1010 5

1010 7

2.14.2 代码实现

hive>

select

    distinct t1.user_id,

    friend_favor.sku_id

from

(

    select

        user1_id user_id,

        user2_id friend_id

    from friendship_info

    union

    select

        user2_id,

        user1_id

    from friendship_info

)t1

left join favor_info friend_favor

on t1.friend_id=friend_favor.user_id

left join favor_info user_favor

on t1.user_id=user_favor.user_id

and friend_favor.sku_id=user_favor.sku_id

where user_favor.sku_id is null;

2.15 查询所有用户的连续登录两天及以上的日期区间

2.15.1 题目需求

从登录明细表(user_login_detail)中查询出,所有用户的连续登录两天及以上的日期区间,以登录时间(login_ts)为准。期望结果如下:

user_id(用户id)

start_date(开始日期)

end_date(结束日期)

101

2021-09-27

2021-09-30

102

2021-10-01

2021-10-02

106

2021-10-04

2021-10-05

107

2021-10-05

2021-10-06

2.15.2 代码实现

hive>

select user_id,

       min(login_date) start_date,

       max(login_date) end_date

from (

         select user_id,

                login_date,

                date_sub(login_date, rn) flag

         from (

                  select user_id,

                         login_date,

                         row_number() over (partition by user_id order by login_date) rn

                  from (

                           select user_id,

                                  date_format(login_ts, 'yyyy-MM-dd') login_date

                           from user_login_detail

                           group by user_id, date_format(login_ts, 'yyyy-MM-dd')

                       ) t1

              ) t2

     ) t3

group by user_id, flag

having count(*) >= 2;

2.16 男性和女性每日的购物总金额统计

2.16.1 题目需求

从订单信息表(order_info)和用户信息表(user_info)中,分别统计每天男性和女性用户的订单总金额,如果当天男性或者女性没有购物,则统计结果为0。期望结果如下:

create_date

日期

total_amount_male

男性用户总金额

total_amount_female

女性用户总金额

2021-09-27

29000.00

0.00

2021-09-28

70500.00

0.00

2021-09-29

43300.00

0.00

2021-09-30

860.00

0.00

2021-10-01

0.00

171680.00

2021-10-02

0.00

76150.00

2021-10-03

89880.00

5910.00

2021-10-04

9390.00

120100.00

2021-10-05

109760.00

69850.00

2021-10-06

101070.00

54300.00

2021-10-07

54700.00

129480.00

2021-10-08

51950.00

24020.00

2.16.2 代码实现

hive>

select create_date,

       sum(if(gender = '男', total_amount, 0)) total_amount_male,

       sum(if(gender = '女', total_amount, 0)) total_amount_female

from order_info oi

         left join

     user_info ui

     on oi.user_id = ui.user_id

group by create_date;

2.17 订单金额趋势分析

2.17.1 题目需求

查询截止每天的最近3天内的订单金额总和以及订单金额日平均值,保留两位小数,四舍五入。期望结果如下:

create_date

(日期)

total_3d

(最近3日订单金额总和)

avg_ad

(最近3日订单金额日平均值)

2021-09-27

29000.00

29000.00

2021-09-28

99500.00

49750.00

2021-09-29

142800.00

47600.00

2021-09-30

114660.00

38220.00

2021-10-01

215840.00

71946.67

2021-10-02

248690.00

82896.67

2021-10-03

343620.00

114540.00

2021-10-04

301430.00

100476.67

2021-10-05

404890.00

134963.33

2021-10-06

464470.00

154823.33

2021-10-07

519160.00

173053.33

2021-10-08

415520.00

138506.67

2.17.2 代码实现

hive>

select create_date,

       round(sum(total_amount_by_day) over (order by create_date rows between 2 preceding and current row ),2) total_3d,

       round(avg(total_amount_by_day) over (order by create_date rows between 2 preceding and current row ), 2) avg_3d

from (

         select create_date,

                sum(total_amount) total_amount_by_day

         from order_info

         group by create_date

     ) t1;

2.18 购买过商品1和商品2但是没有购买商品3的顾客

2.18.1 题目需求

从订单明细表(order_detail)中查询出所有购买过商品1和商品2,但是没有购买过商品3的用户,期望结果如下:

user_id

103

105

2.18.2 代码实现

hive>

select user_id

from (

         select user_id,

                collect_set(sku_id) skus

         from order_detail od

                  left join

              order_info oi

              on od.order_id = oi.order_id

         group by user_id

     ) t1

where array_contains(skus, '1')

  and array_contains(skus, '2')

  and !array_contains(skus, '3');

2.19 统计每日商品1和商品2销量的差值

2.19.1 题目需求

从订单明细表(order_detail)中统计每天商品1和商品2销量(件数)的差值(商品1销量-商品2销量),期望结果如下:

create_date

diff

2021-09-27

2

2021-10-01

-10

2021-10-02

-49

2021-10-03

4

2021-10-04

-55

2021-10-05

-30

2021-10-06

-49

2021-10-07

-40

2021-10-08

-24

2.19.2 代码实现

hive>

select create_date,

       sum(if(sku_id = '1', sku_num, 0)) - sum(if(sku_id = '2', sku_num, 0)) diff

from order_detail

where sku_id in ('1', '2')

group by create_date;

2.20 查询出每个用户的最近三笔订单

2.20.1 题目需求

从订单信息表(order_info)中查询出每个用户的最近三笔订单,期望结果如下:

user_id

order_id

create_date

101

2

2021-09-28

101

3

2021-09-29

101

4

2021-09-30

102

5

2021-10-01

102

6

2021-10-01

102

8

2021-10-02

103

9

2021-10-02

103

10

2021-10-02

103

12

2021-10-03

104

13

2021-10-03

104

14

2021-10-03

104

15

2021-10-03

105

17

2021-10-04

105

18

2021-10-04

105

19

2021-10-04

106

22

2021-10-05

106

23

2021-10-05

106

24

2021-10-05

107

25

2021-10-05

107

27

2021-10-06

107

28

2021-10-06

108

29

2021-10-06

108

31

2021-10-07

108

32

2021-10-07

109

33

2021-10-07

109

35

2021-10-08

109

36

2021-10-08

1010

37

2021-10-08

1010

38

2021-10-08

2.20.2 代码实现

hive>

select user_id,

       order_id,

       create_date

from (

         select user_id

              , order_id

              , create_date

              , row_number() over (partition by user_id order by create_date desc) rk

         from order_info

     ) t1

where rk <= 3;

2.21 查询每个用户登录日期的最大空档期

2.21.1 题目需求

从登录明细表(user_login_detail)中查询每个用户两个登录日期(以login_ts为准)之间的最大的空档期。统计最大空档期时,用户最后一次登录至今的空档也要考虑在内,假设今天为2021-10-10。期望结果如下:

user_id(用户id)

max_diff(最大空档期)

101

10

102

9

103

10

104

9

105

6

106

5

107

10

108

4

109

10

1010

12

2.21.2 代码实现

hive>

select

    user_id,

    max(diff) max_diff

from

(

    select

        user_id,

        datediff(next_login_date,login_date) diff

    from

    (

        select

            user_id,

            login_date,

            lead(login_date,1,'2021-10-10') over(partition by user_id order by login_date) next_login_date

        from

        (

            select

                user_id,

                date_format(login_ts,'yyyy-MM-dd') login_date

            from user_login_detail

            group by user_id,date_format(login_ts,'yyyy-MM-dd')

        )t1

    )t2

)t3

group by user_id;

2.22 查询相同时刻多地登陆的用户

2.22.1 题目需求

从登录明细表(user_login_detail)中查询在相同时刻,多地登陆(ip_address不同)的用户,期望结果如下:

user_id(用户id)

101

102

104

107

2.22.2 代码实现

hive>

select

  distinct t2.user_id

from

  (

   select

     t1.user_id,

     if(t1.max_logout is null ,2,if(t1.max_logout<t1.login_ts,1,0)) flag

   from

     (

      select

        user_id,

        login_ts,

        logout_ts,

        max(logout_ts)over(partition by user_id order by login_ts rows between unbounded preceding and 1 preceding) max_logout

      from

        user_login_detail

   )t1

)t2

where

  t2.flag=0

2.23 销售额完成任务指标的商品

2.23.1 题目需求

商家要求每个商品每个月需要售卖出一定的销售总额

假设1号商品销售总额大于21000,2号商品销售总额大于10000,其余商品没有要求

请写出SQL从订单详情表中(order_detail)查询连续两个月销售总额大于等于任务总额的商品

结果如下:

sku_id(商品id)

1

2.23.2 代码实现及步骤

hive>

-- 求出1号商品  和  2号商品 每个月的购买总额 并过滤掉没有满足指标的商品

select

  sku_id,

  concat(substring(create_date,0,7),'-01') ymd,

  sum(price*sku_num)  sku_sum

from

  order_detail

where

  sku_id=1 or sku_id=2

group by

  sku_id,substring(create_date,0,7)

having

  (sku_id=1 and sku_sum>=21000) or (sku_id=2 and sku_sum>=10000)

-- 判断是否为连续两个月

select

  distinct t3.sku_id

from

  (

    select

      t2.sku_id,

      count(*)over(partition by t2.sku_id,t2.rymd) cn

    from

      (

        select

          t1.sku_id,

          add_months(t1.ymd,-row_number()over(partition by t1.sku_id order by t1.ymd)) rymd

        from

          (

           select

             sku_id,

             concat(substring(create_date,0,7),'-01') ymd,

             sum(price*sku_num)  sku_sum

           from

             order_detail

           where

             sku_id=1 or sku_id=2

           group by

             sku_id,substring(create_date,0,7)

           having

             (sku_id=1 and sku_sum>=21000) or (sku_id=2 and sku_sum>=10000)

        )t1

    )t2

)t3

where

  t3.cn>=2

2.24 根据商品销售情况进行商品分类

2.24.1 题目需求

从订单详情表中(order_detail)对销售件数对商品进行分类,0-5000为冷门商品,5001-19999位一般商品,20000往上为热门商品,并求出不同类别商品的数量

结果如下:

Category(类型)

Cn(数量)

一般商品

1

冷门商品

10

热门商品

1

2.24.2 代码实现

hive>

select

  t2.category,

  count(*) cn

from

  (

    select

      t1.sku_id,

      case

      when  t1.sku_sum >=0 and t1.sku_sum<=5000 then '冷门商品'

      when  t1.sku_sum >=5001 and t1.sku_sum<=19999 then '一般商品'

      when  t1.sku_sum >=20000 then '热门商品'

      end  category

    from

      (

        select

          sku_id,

          sum(sku_num)  sku_sum

        from

          order_detail

        group by

          sku_id

    )t1

)t2

group by

  t2.category

2.25 各品类销量前三的所有商品

2.25.1 题目需求

从订单详情表中(order_detail)和商品(sku_info)中查询各个品类销售数量前三的商品。如果该品类小于三个商品,则输出所有的商品销量。

结果如下:

Sku_id(商品id)

Category_id(品类id)

2

1

4

1

1

1

8

2

7

2

5

2

12

3

11

3

10

3

2.25.2 代码实现

hive>

select

  t2.sku_id,

  t2.category_id

from

  (

    select

      t1.sku_id,

      si.category_id,

      rank()over(partition by category_id order by t1.sku_sum desc) rk

    from

      (

        select

          sku_id,

          sum(sku_num) sku_sum

        from

          order_detail

        group by

          sku_id

    )t1

    join

      sku_info si

    on

      t1.sku_id=si.sku_id

    )t2

where

  t2.rk<=3;

2.26 各品类中商品价格的中位数

2.26.1 题目需求

从商品(sku_info)中球中位数如果是偶数则输出中间两个值的平均值,如果是奇数,则输出中间数即可。

结果如下:

Category_id(品类id)

Medprice(中位数)

1

3500.0

2

1250.0

3

510.0

2.26.2 代码实现

hive>

--求个每个品类 价格排序 商品数量 以及打上奇偶数的标签

select

  sku_id,

  category_id,

  price,

  row_number()over(partition by category_id order by price desc) rk,

  count(*)over(partition by category_id) cn,

  count(*)over(partition by category_id)%2 falg

from

  sku_info  t1

--求出偶数品类的中位数

select

  distinct t1.category_id,

  avg(t1.price)over(partition by t1.category_id) medprice

from

  (

select

  sku_id,

  category_id,

  price,

  row_number()over(partition by category_id order by price desc) rk,

  count(*)over(partition by category_id) cn,

  count(*)over(partition by category_id)%2 falg

from

  sku_info

)t1

where

  t1.falg=0 and (t1.rk=cn/2  or t1.rk=cn/2+1)

--求出奇数品类的中位数

select

  t1.category_id,

  t1.price

from

  (

    select

      sku_id,

      category_id,

      price,

      row_number()over(partition by category_id order by price desc) rk,

      count(*)over(partition by category_id) cn,

      count(*)over(partition by category_id)%2 falg

    from

      sku_info

)t1

where

  t1.falg=1 and t1.rk=round(cn/2)

-- 竖向拼接

select

  distinct t1.category_id,

  avg(t1.price)over(partition by t1.category_id) medprice

from

  (

select

  sku_id,

  category_id,

  price,

  row_number()over(partition by category_id order by price desc) rk,

  count(*)over(partition by category_id) cn,

  count(*)over(partition by category_id)%2 falg

from

  sku_info

)t1

where

  t1.falg=0 and (t1.rk=cn/2  or t1.rk=cn/2+1)

union

select

  t1.category_id,

  t1.price/1

from

  (

    select

      sku_id,

      category_id,

      price,

      row_number()over(partition by category_id order by price desc) rk,

      count(*)over(partition by category_id) cn,

      count(*)over(partition by category_id)%2 falg

    from

      sku_info

)t1

where

  t1.falg=1 and t1.rk=round(cn/2)

2.27 找出销售额连续3天超过100的商品

2.27.1 题目需求

从订单详情表(order_detail)中找出销售额连续3天超过100的商品

结果如下:

Sku_id(商品id)

1

10

11

12

2

3

4

5

6

7

8

9

2.27.2 代码实现

hive>

-- 每个商品每天的销售总额

select

  sku_id,

  create_date,

  sum(price*sku_num) sku_sum

from

  order_detail

group by

  sku_id,create_date

having

  sku_sum>=100

--  判断连续三天以上

select

  distinct t3.sku_id

from

  (

    select

      t2.sku_id,

      count(*)over(partition by t2.sku_id,t2.date_drk) cdrk

    from

      (

        select

          t1.sku_id,

          t1.create_date,

          date_sub(t1.create_date,rank()over(partition by t1.sku_id order by t1.create_date)) date_drk

        from

          (

            select

              sku_id,

              create_date,

              sum(price*sku_num) sku_sum

            from

              order_detail

            group by

              sku_id,create_date

            having

              sku_sum>=100

        )t1

    )t2

)t3

where

  t3.cdrk>=3

2.28 查询有新注册用户的当天的新用户数量、新用户的第一天留存率

2.28.1 题目需求

从用户登录明细表(user_login_detail)中首次登录算作当天新增,第二天也登录了算作一日留存

结果如下:

first_login(注册时间)

Register(新增用户数)

Retention(留存率)

2021-09-21

1

0.0

2021-09-22

1

0.0

2021-09-23

1

0.0

2021-09-24

1

0.0

2021-09-25

1

0.0

2021-09-26

1

0.0

2021-09-27

1

0.0

2021-10-04

2

0.5

2021-10-06

1

0.0

2.28.2 代码实现

hive>

-- 每个用户首次登录时间 和 第二天是否登录 并看每天新增和留存数量

select

  t1.first_login,

  count(t1.user_id) register,

  count(t2.user_id) remain_1

from

  (

   select

     user_id,

     date_format(min(login_ts),'yyyy-MM-dd')   first_login

   from

     user_login_detail

   group by

     user_id

   )t1

left join

  user_login_detail t2

on

  t1.user_id=t2.user_id and datediff(date_format(t2.login_ts,'yyyy-MM-dd'),t1.first_login)=1

group by

  t1.first_login  

-- 新增数量和留存率

select

  t3.first_login,

  t3.register,

  t3.remain_1/t3.register retention

from

  (

   select

     t1.first_login,

     count(t1.user_id) register,

     count(t2.user_id) remain_1

   from

     (

      select

        user_id,

        date_format(min(login_ts),'yyyy-MM-dd')   first_login

      from

        user_login_detail

      group by

        user_id

      )t1

   left join

     user_login_detail t2

   on

     t1.user_id=t2.user_id and datediff(date_format(t2.login_ts,'yyyy-MM-dd'),t1.first_login)=1

   group by

     t1.first_login

)t3

2.29 求出商品连续售卖的时间区间

2.29.1 题目需求

从订单详情表(order_detail)中,求出商品连续售卖的时间区间

结果如下(截取部分):

Sku_id(商品id)

Start_date(起始时间)

End_date(结束时间)

1

2021-09-27

2021-09-27

1

2021-09-30

2021-10-01

1

2021-10-03

2021-10-08

10

2021-10-02

2021-10-03

10

2021-10-05

2021-10-08

11

2021-10-02

2021-10-08

12

2021-09-30

2021-09-30

12

2021-10-02

2021-10-06

12

2021-10-08

2021-10-08

2.29.2 代码实现

hive>

-- 每个商品售卖的日期以及拿到按排序后日期的差值

select

  sku_id,

  create_date,

  date_sub(create_date,rank()over(partition by sku_id order by create_date)) ddrk

from

  order_detail

group by

  sku_id,create_date

-- 拿到每次售卖的区间

select

  distinct

  sku_id,

  first_value(t1.create_date)over(partition by t1.sku_id,t1.ddrk order by t1.create_date  rows between unbounded preceding and unbounded following) start_date,

  last_value(t1.create_date)over(partition by t1.sku_id,t1.ddrk order by t1.create_date  rows between unbounded preceding and unbounded following) end_date

from

  (

   select

     sku_id,

     create_date,

     date_sub(create_date,rank()over(partition by sku_id order by create_date)) ddrk

   from

     order_detail

   group by

     sku_id,create_date

)t1

2.30 登录次数及交易次数统计

2.30.1 题目需求

分别从登陆明细表(user_login_detail)和配送信息表中用户登录时间和下单时间统计登陆次数和交易次数

结果如下(截取部分):

User_id

(用户id)

Login_date

(登录时间)

login_count

(登陆次数)

Order_count

(交易次数)

101

2021-09-21

1

0

101

2021-09-27

1

1

101

2021-09-28

1

1

101

2021-09-29

1

1

101

2021-09-30

1

1

1010

2021-09-27

1

0

1010

2021-10-09

1

0

102

2021-09-22

1

0

102

2021-10-01

2

3

2.30.2 代码实现

hive>

-- 拿到每个用户每天的登录次数

select

  user_id,

  date_format(login_ts,'yyyy-MM-dd') login_date,

  count(*) login_count

from

  user_login_detail

group by

  user_id,date_format(login_ts,'yyyy-MM-dd')

-- 拿到每个用户每天的交易次数

select

  t1.user_id,

  t1.login_date,

  collect_set(t1.login_count)[0] login_count ,

  count(di.user_id) order_count

from

  (

   select

     user_id,

     date_format(login_ts,'yyyy-MM-dd') login_date,

     count(*) login_count

   from

     user_login_detail

   group by

     user_id,date_format(login_ts,'yyyy-MM-dd')

)t1

left join

  delivery_info di

on

  t1.user_id=di.user_id and t1.login_date=di.order_date

group by

  t1.user_id,t1.login_date

2.31 按年度列出每个商品销售总额

2.31.1 题目需求

从订单明细表(order_detail)中列出每个商品每个年度的购买总额

结果如下(截取部分):

Sku_id(商品id)

Year_date(年份)

Sku_sum(销售总额)

1

2021

102000.00

10

2021

29900.00

11

2021

16000.00

12

2021

413640.00

2

2021

60440.00

3

2021

180000.00

4

2021

318000.00

5

2021

121000.00

6

2021

64000.00

7

2021

25200.00

8

2021

151800.00

9

2021

194000.00

2.31.2 代码实现

hive>

select

  sku_id,

  year(create_date) year_date,

  sum(price*sku_num) sku_sum

from

  order_detail

group by

  sku_id,year(create_date)

2.32. 某周内每件商品每天销售情况

2.32.1 题目需求

从订单详情表(order_detail)中查询2021年9月27号-2021年10月3号这一周所有商品每天销售情况。

结果如下:

Sku_id

(商品id)

Monday

Tuesday

Wednesday

Thursday

Friday

Saturday

Sunday

1

0

0

9

8

0

4

2

10

0

0

0

0

48

69

0

11

0

0

0

0

15

61

0

12

0

0

43

0

31

20400

0

2

0

0

0

18

5800

0

0

3

0

0

0

6

0

1

5

4

9

0

0

8

1

5

0

5

33

0

0

0

24

47

0

6

0

0

0

1

5

8

0

7

0

37

0

17

0

20

0

8

0

46

0

48

39

0

0

9

0

12

0

45

0

0

0

2.32.2 代码实现

hive>

select

  sku_id,

  sum(if(dayofweek(create_date)=2,sku_num,0)) Monday,

  sum(if(dayofweek(create_date)=3,sku_num,0)) Tuesday,

  sum(if(dayofweek(create_date)=4,sku_num,0)) Wednesday,

  sum(if(dayofweek(create_date)=5,sku_num,0)) Thursday,

  sum(if(dayofweek(create_date)=6,sku_num,0)) Friday,

  sum(if(dayofweek(create_date)=7,sku_num,0)) Saturday,

  sum(if(dayofweek(create_date)=1,sku_num,0)) Sunday

from

  order_detail

where

  create_date>='2021-09-27' and create_date<='2021-10-03'

group by

  sku_id

2.33 查看每件商品的售价涨幅情况

2.33.1 题目需求

从商品价格变更明细表(sku_price_modify_detail),得到最近一次价格的涨幅情况,并按照涨幅升序排序。

结果如下:

Sku_id(商品id)

Price_change(涨幅)

8

-200.00

9

-100.00

2

-70.00

11

-16.00

12

-15.00

3

1.00

5

10.00

10

10.00

7

12.00

6

12.00

1

100.00

4

400.00

2.33.2 代码实现

hive>

-- 对每个商品按照修改日期倒序排序 并求出差值

select

  sku_id,

  new_price-lead(new_price,1,0)over(partition by sku_id order by change_date desc) price_change,

  rank()over(partition by sku_id order by change_date desc) rk

from

  sku_price_modify_detail   t1

-- 最近一次修改的价格

select

  t1.sku_id,

  t1.price_change

from

  (

    select

      sku_id,

      new_price-lead(new_price,1,0)over(partition by sku_id order by change_date desc) price_change,

      rank()over(partition by sku_id order by change_date desc) rk

    from

      sku_price_modify_detail

)t1

where

  rk=1

order by

  t1.price_change  

2.34 销售订单首购和次购分析

2.34.1 题目需求

通过商品信息表(sku_info)订单信息表(order_info)订单明细表(order_detail)分析如果有一个用户成功下单两个及两个以上的购买成功的手机订单(购买商品为xiaomi 10,apple 12,小米13)那么输出这个用户的id及第一次成功购买手机的日期和第二次成功购买手机的日期,以及购买手机成功的次数。

结果如下:

User_id

(用户id)

First_date

(首次时间)

Last_value

(末次时间)

Cn

(购买次数)

101

2021-09-27

2021-09-28

3

1010

2021-10-08

2021-10-08

2

102

2021-10-01

2021-10-01

3

103

2021-09-30

2021-10-02

2

104

2021-10-03

2021-10-03

3

105

2021-10-04

2021-10-04

2

106

2021-10-04

2021-10-05

3

107

2021-10-05

2021-10-05

3

108

2021-10-06

2021-10-06

3

109

2021-10-07

2021-10-07

3

2.34.2 代码实现

hive>

select

  distinct oi.user_id,

  first_value(od.create_date)over(partition by oi.user_id order by od.create_date rows between unbounded preceding and unbounded following ) first_date,

  last_value(od.create_date)over(partition by oi.user_id order by od.create_date rows between unbounded preceding and unbounded following ) last_date,

  count(*)over(partition by oi.user_id order by od.create_date rows between unbounded preceding and unbounded following) cn

from

   order_info oi

join

   order_detail od

on

  oi.order_id=od.order_id

join

  sku_info si

on

  od.sku_id=si.sku_id

where

  si.name in('xiaomi 10','apple 12','xiaomi 13')

2.35 同期商品售卖分析表

2.35.1 题目需求

从订单明细表(order_detail)中。

求出同一个商品在2021年和2022年中同一个月的售卖情况对比。

结果如下(截取部分):

Sku_id

(商品id)

Month

(月份)

2020_skusum

(2020销售量)

2021_skusum

(2021销售量)

1

9

0

11

1

10

2

38

10

10

94

205

11

10

95

225

12

9

0

43

12

10

83

20556

2

10

26

6018

3

9

0

5

3

10

1

30

4

9

0

9

2.35.2 代码实现

hive>

select

  if(t1.sku_id is null,t2.sku_id,t1.sku_id),

  month(if(t1.ym is null,t2.ym,t1.ym)) ,

  if(t1.sku_sum is null ,0 ,t1.sku_sum) 2020_skusum,

  if(t2.sku_sum is null ,0 ,t2.sku_sum) 2020_skusum

from

  (

    select

      sku_id,

      concat(date_format(create_date,'yyyy-MM'),'-01') ym,

      sum(sku_num) sku_sum

    from

      order_detail

    where

      year(create_date)=2020

    group by

      sku_id,date_format(create_date,'yyyy-MM')

)t1

full join

  (

    select

      sku_id,

      concat(date_format(create_date,'yyyy-MM'),'-01')  ym,

      sum(sku_num) sku_sum

    from

      order_detail

    where

      year(create_date)=2021

    group by

      sku_id,date_format(create_date,'yyyy-MM')

)t2

on

  t1.sku_id=t2.sku_id and month(t1.ym) = month(t2.ym)

2.36 国庆期间每个品类的商品的收藏量和购买量

2.36.1 题目需求

从订单明细表(order_detail)和收藏信息表(favor_info)统计2021国庆期间,每个商品总收藏量和购买量

结果如下:

Sku_id

Sku_sum(购买量)

Favor_cn(收藏量)

1

38

1

10

205

2

11

225

2

12

20556

0

2

6018

1

3

30

0

4

44

2

5

209

1

6

26

1

7

180

1

8

148

0

9

182

1

2.36.2 代码实现

hive>

select

  t1.sku_id,

  t1.sku_sum,

  t2.favor_cn

from

  (

    select

      sku_id,

      sum(sku_num) sku_sum

    from

      order_detail

    where

      create_date>='2021-10-01' and create_date<='2021-10-07'

    group by

      sku_id

)t1

join

  (

    select

      sku_id,

      count(*) favor_cn

    from

      favor_info

    where

      create_date>='2021-10-01' and create_date<='2021-10-07'

    group by

      sku_id

)t2

on

  t1.sku_id=t2.sku_id

2.37 统计活跃间隔对用户分级结果

2.37.1 题目需求

用户等级:

忠实用户:近7天活跃且非新用户

新晋用户:近7天新增

沉睡用户:近7天未活跃但是在7天前活跃

流失用户:近30天未活跃但是在30天前活跃

假设今天是数据中所有日期的最大值,从用户登录明细表中的用户登录时间给各用户分级,求出各等级用户的人数

结果如下:

Level(用户等级)

Cn(用户数量)

忠实用户

6

新增用户

3

沉睡用户

1

2.37.2 代码实现

hive>

select

  t2.level,

  count(*)

from

  (

    select

      uld.user_id,

      case

         when (date_format(max(uld.login_ts),'yyyy-MM-dd') <=date_sub(today, 30))

             then '流失用户'-- 最近登录时间三十天前

         when (date_format(min(uld.login_ts),'yyyy-MM-dd') <=date_sub(today, 7) and date_format(max(uld.login_ts),'yyyy-MM-dd') >=date_sub(today, 7))

             then '忠实用户' -- 最早登陆时间是七天前,并且最近七天登录过

         when (date_format(min(uld.login_ts),'yyyy-MM-dd') >=date_sub(today, 7))

             then '新增用户' -- 最早登录时间是七天内

         when (date_format(min(uld.login_ts),'yyyy-MM-dd') <= date_sub(today, 7) and date_format(max(uld.login_ts),'yyyy-MM-dd') <= date_sub(today, 7))

             then '沉睡用户'-- 最早登陆时间是七天前,最大登录时间也是七天前

       end level

    from

      user_login_detail  uld

    join

      (

        select

          date_format(max(login_ts),'yyyy-MM-dd') today

        from

          user_login_detail

    )t1

    on

      1=1

    group by

      uld.user_id,t1.today

    )t2

group by

  t2.level

2.38 连续签到领金币数

2.38.1 题目需求

用户每天签到可以领1金币,并可以累计签到天数,连续签到的第3、7天分别可以额外领2和6金币。

每连续签到7天重新累积签到天数。

从用户登录明细表中求出每个用户金币总数,并按照金币总数倒序排序

结果如下:

User_id(用户id)

Sum_coin_cn(金币总数)

101

7

109

3

107

3

102

3

106

2

104

2

103

2

1010

2

108

1

105

1

2.38.2 代码实现

hive>

-- 求连续并标志是连续的第几天

select

  t1.user_id,

  t1.login_date,

  date_sub(t1.login_date,t1.rk) login_date_rk,

  count(*)over(partition by t1.user_id, date_sub(t1.login_date,t1.rk) order by t1.login_date) counti_cn

from

  (

   select

     user_id,

     date_format(login_ts,'yyyy-MM-dd') login_date,

     rank()over(partition by user_id order by date_format(login_ts,'yyyy-MM-dd')) rk

   from

     user_login_detail

   group by

     user_id,date_format(login_ts,'yyyy-MM-dd')

)t1

--求出金币数量,以及签到奖励的金币数量

select

  t2.user_id,

  max(t2.counti_cn)+sum(if(t2.counti_cn%3=0,2,0))+sum(if(t2.counti_cn%7=0,6,0)) coin_cn

from

  (

select

  t1.user_id,

     t1.login_date,

     date_sub(t1.login_date,t1.rk) login_date_rk,

     count(*)over(partition by t1.user_id, date_sub(t1.login_date,t1.rk) order by t1.login_date) counti_cn

   from

     (

      select

        user_id,

        date_format(login_ts,'yyyy-MM-dd') login_date,

        rank()over(partition by user_id order by date_format(login_ts,'yyyy-MM-dd')) rk

      from

        user_login_detail

      group by

        user_id,date_format(login_ts,'yyyy-MM-dd')

   )t1

)t2

group by

  t2.user_id,t2.login_date_rk

-- 求出每个用户的金币总数

select

  t3.user_id,

  sum(t3.coin_cn) sum_coin_cn

from

  (

    select

      t2.user_id,

      max(t2.counti_cn)+sum(if(t2.counti_cn%3=0,2,0))+sum(if(t2.counti_cn%7=0,6,0)) coin_cn

    from

      (

    select

      t1.user_id,

         t1.login_date,

         date_sub(t1.login_date,t1.rk) login_date_rk,

         count(*)over(partition by t1.user_id, date_sub(t1.login_date,t1.rk) order by t1.login_date) counti_cn

       from

         (

          select

            user_id,

            date_format(login_ts,'yyyy-MM-dd') login_date,

            rank()over(partition by user_id order by date_format(login_ts,'yyyy-MM-dd')) rk

          from

            user_login_detail

          group by

            user_id,date_format(login_ts,'yyyy-MM-dd')

       )t1

    )t2

    group by

      t2.user_id,t2.login_date_rk

    )t3

group by

  t3.user_id

order by

  sum_coin_cn desc

2.39 国庆期间的7日动销率和滞销率

2.39.1 题目需求

动销率定义为品类商品中一段时间内有销量的商品占当前已上架总商品数的比例(有销量的商品/已上架总商品数)。

滞销率定义为品类商品中一段时间内没有销量的商品占当前已上架总商品数的比例。(没有销量的商品 / 已上架总商品数)。

只要当天任一店铺有任何商品的销量就输出该天的结果

从订单明细表(order_detail)和商品信息表(sku_info)表中求出国庆7天每天每个品类的商品的动销率和滞销率

结果如下(截取部分):

Category_id

(品类id)

1号

(动销)

1号

(滞销)

2号

(动销)

2号

(滞销)

3号

(动销)

3号

(滞销)

1

1.0

0.0

0.5

0.5

0.75

0.25

2

0.75

0.25

0.75

0.25

0.75

0.25

3

0.25

0.75

0.75

0.25

0.75

0.25

2.39.2 代码实现

hive>

-- 国庆每一天 每个商品品类有多少商品被销售了

select

  t1.category_id,

  sum(if(t1.create_date='2021-10-01',1,0)) `第1天`,

  sum(if(t1.create_date='2021-10-02',1,0)) `第2天`,

  sum(if(t1.create_date='2021-10-03',1,0)) `第3天`,

  sum(if(t1.create_date='2021-10-04',1,0)) `第4天`,

  sum(if(t1.create_date='2021-10-05',1,0)) `第5天`,

  sum(if(t1.create_date='2021-10-06',1,0)) `第6天`,

  sum(if(t1.create_date='2021-10-07',1,0)) `第7天`

from

  (

    select

      distinct

      si.category_id,

      od.create_date,

      si.name

    from

      order_detail od

    join

      sku_info si

    on

      od.sku_id=si.sku_id

    where

      od.create_date>='2021-10-01' and od.create_date<='2021-10-07'

)t1

group by

  t1.category_id

-- 每一天的动销率 和 滞销率

select

  t2.category_id,

  t2.`第1天`/t3.cn,

  1-t2.`第1天`/t3.cn,

  t2.`第2天`/t3.cn,

  1-t2.`第2天`/t3.cn,

  t2.`第3天`/t3.cn,

  1-t2.`第3天`/t3.cn,

  t2.`第4天`/t3.cn,

  1-t2.`第4天`/t3.cn,

  t2.`第5天`/t3.cn,

  1-t2.`第5天`/t3.cn,

  t2.`第6天`/t3.cn,

  1-t2.`第6天`/t3.cn,

  t2.`第7天`/t3.cn,

  1-t2.`第7天`/t3.cn

from

  (

   select

     t1.category_id,

     sum(if(t1.create_date='2021-10-01',1,0)) `第1天`,

     sum(if(t1.create_date='2021-10-02',1,0)) `第2天`,

     sum(if(t1.create_date='2021-10-03',1,0)) `第3天`,

     sum(if(t1.create_date='2021-10-04',1,0)) `第4天`,

     sum(if(t1.create_date='2021-10-05',1,0)) `第5天`,

     sum(if(t1.create_date='2021-10-06',1,0)) `第6天`,

     sum(if(t1.create_date='2021-10-07',1,0)) `第7天`

   from

     (

       select

         distinct

         si.category_id,

         od.create_date,

         si.name

       from

         order_detail od

       join

         sku_info si

       on

         od.sku_id=si.sku_id

       where

         od.create_date>='2021-10-01' and od.create_date<='2021-10-07'

   )t1

   group by

     t1.category_id

   )t2

join

  (

    select

      category_id,

      count(*) cn

    from

      sku_info

    group by

      category_id

    )t3

on

  t2.category_id=t3.category_id

2.40 同时在线最多的人数

2.40.1 题目需求

根据用户登录明细表(user_login_detail),求出平台同时在线最多的人数。

结果如下:

Cn(人数)

7

2.40.2 代码实现

hive>

-- 登录标记1 下线标记-1

select

  login_ts l_time,

  1 flag

from

  user_login_detail

union

select

  logout_ts l_time,

  -1 flag

from

  user_login_detail

-- 按照时间求和

select

  sum(flag)over(order by t1.l_time) sum_l_time

from

  (

    select

      login_ts l_time,

      1 flag

    from

      user_login_detail

    union

    select

      logout_ts l_time,

      -1 flag

    from

      user_login_detail

)t1  

-- 拿到最大值 就是同时在线最多人数

select

  max(sum_l_time)

from

  (

    select

      sum(flag)over(order by t1.l_time) sum_l_time

    from

      (

        select

          login_ts l_time,

          1 flag

        from

          user_login_detail

        union

        select

          logout_ts l_time,

          -1 flag

        from

          user_login_detail

    )t1

)t2

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
H SQL是指在Hive数据库中使用SQL语句解决的实际问。以下是一些Hive SQL的分类汇总: 1. 基本查询:例如,从user_info表中查询所有用户的姓名和所在地,并按地点进行分组。 2. 条件查询:例如,从order表中查询购买金额大于100的订单信息。 3. 排序与限制:例如,从product表中按照销售额降序排列,并只显示前10个产品。 4. 聚合和分组:例如,计算每个地区的销售总额和平均销售额。 5. 连接查询:例如,从order表和user表中查询订单和用户信息,并根据用户ID进行连接。 6. 子查询:例如,查询购买金额最高的用户的详细信息。 7. 更新和删除:例如,更新user表中的用户信息或删除过期的订单数据。 8. 数据转换:例如,将一列数据按照指定的分隔符进行拼接。 Hive SQL通常涉及到数据查询、数据操作和数据转换等方面,需要熟悉Hive SQL语法和函数的使用。通过解决这些真,可以提高对Hive SQL的理解和应用能力,并在实际工作中更加熟练地使用Hive数据库。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [大厂面试汇总-HiveSQL篇(持续更行中……)](https://blog.csdn.net/thenowaiting/article/details/129471886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Hive SQL行列转换](https://blog.csdn.net/yangyang222222222/article/details/114871793)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [通俗易懂的Hive升级版教程(配套资料)](https://download.csdn.net/download/weixin_26779013/19666180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值