IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL打卡练习-5 -> 正文阅读

[大数据]MySQL打卡练习-5

MySQL打卡练习-5

练习一:行转列

问题描述

假设有如下比赛结果

+--------------+-----------+
|    cdate     |   result  |
+--------------+-----------+
|  2021-01-01  |     胜    |
|  2021-01-01  |     负    |
|  2021-01-03  |     胜    |
|  2021-01-03  |     负    |
|  2021-01-01  |     胜    |
|  2021-01-03  |     负    |
+------------+-----------+

请使用 SQL 将比赛结果转换为如下形式:

+--------------+-----+-----|
|  比赛日期     | 胜  | 负  |
+--------------+-----------+
|  2021-01-01  |  2  |  1  |
|  2021-01-03  |  1  |  2  |
+------------+-----------+

解题答案

创建数据

CREATE TABLE compete
(
    c_date DATE,
    result CHAR
);

INSERT INTO compete
VALUES (20210101, "胜"),
       (20210101, "负"),
       (20210103, "胜"),
       (20210103, "负"),
       (20210101, "胜"),
       (20210103, "负");

解题答案

SELECT c_date                                as "比赛日期",
       COUNT(IF(result = "胜", result, NULL)) as "胜",
       COUNT(IF(result = "负", result, NULL)) as "负"
FROM compete
GROUP BY c_date;

练习二:列转行

问题描述

假设有如下比赛结果

+--------------+-----+-----|
|  比赛日期     | 胜  | 负  |
+--------------+-----------+
|  2021-01-01  |  2  |  1  |
|  2021-01-03  |  1  |  2  |
+------------+-----------+

请使用 SQL 将比赛结果转换为如下形式:

+--------------+-----------+
|    cdate     |   result  |
+--------------+-----------+
|  2021-01-01  |     胜    |
|  2021-01-01  |     负    |
|  2021-01-03  |     胜    |
|  2021-01-03  |     负    |
|  2021-01-01  |     胜    |
|  2021-01-03  |     负    |
+------------+-----------+

解题答案

创建数据

CREATE TABLE compete_score
(
    比赛日期 DATE,INT,INT
);
INSERT INTO compete_score
VALUES ("20210101", 2, 1),
       ("20210103", 1, 2);

解题答案

暂无

练习三:连续登录

问题描述

有用户表行为记录表t_act_records表,包含两个字段:uid(用户ID),imp_date(日期)

  1. 计算2021年每个月,每个用户连续登录的最多天数
  2. 计算2021年每个月,连续2天都有登录的用户名单
  3. 计算2021年每个月,连续5天都有登录的用户数

构造表mysql如下:

DROP TABLE if EXISTS t_act_records;
CREATE TABLE t_act_records
(uid  VARCHAR(20),
imp_date DATE);

INSERT INTO t_act_records VALUES('u1001', 20210101);
INSERT INTO t_act_records VALUES('u1002', 20210101);
INSERT INTO t_act_records VALUES('u1003', 20210101);
INSERT INTO t_act_records VALUES('u1003', 20210102);
INSERT INTO t_act_records VALUES('u1004', 20210101);
INSERT INTO t_act_records VALUES('u1004', 20210102);
INSERT INTO t_act_records VALUES('u1004', 20210103);
INSERT INTO t_act_records VALUES('u1004', 20210104);
INSERT INTO t_act_records VALUES('u1004', 20210105);

解题答案

解题答案

# 解题方法:https://zhuanlan.zhihu.com/p/373033198
# step0:连续登录下imp_date - ranking 所得值相同
SELECT uid, imp_date, ROW_NUMBER() over (PARTITION BY uid ORDER BY imp_date) as "ranking"
FROM t_act_records;

# step1:做减法
SELECT *, DATE_SUB(imp_date, INTERVAL ranking DAY) as ds
FROM (
         SELECT uid, imp_date, ROW_NUMBER() over (PARTITION BY uid ORDER BY imp_date) as "ranking"
         FROM t_act_records) as test;

# step2:统计连续登录的用户天数
SELECT uid, ds, COUNT(1)
FROM (SELECT *, DATE_SUB(imp_date, INTERVAL ranking DAY) as ds
      FROM (
               SELECT uid, imp_date, ROW_NUMBER() over (PARTITION BY uid ORDER BY imp_date) as "ranking"
               FROM t_act_records) as test) as sub_ds
GROUP BY uid, ds
;
# 问题:3.1. 计算2021年每个月,每个用户连续登录的最多天数
SELECT DISTINCT uid, ds, COUNT(1)
FROM (SELECT *, DATE_SUB(imp_date, INTERVAL ranking DAY) as ds
      FROM (
               SELECT uid, imp_date, ROW_NUMBER() over (PARTITION BY uid ORDER BY imp_date) as "ranking"
               FROM t_act_records) as test) as sub_ds
GROUP BY uid, ds
;
# 问题 3.2. 计算2021年每个月,连续2天都有登录的用户名单
SELECT DISTINCT uid, ds, COUNT(1)
FROM (SELECT *, DATE_SUB(imp_date, INTERVAL ranking DAY) as ds
      FROM (
               SELECT uid, imp_date, ROW_NUMBER() over (PARTITION BY uid ORDER BY imp_date) as "ranking"
               FROM t_act_records) as test) as sub_ds
GROUP BY uid, ds
HAVING COUNT(1) >= 3
;
# 问题 3.3. 计算2021年每个月,连续5天都有登录的用户数
SELECT DISTINCT uid, ds, COUNT(1)
FROM (SELECT *, DATE_SUB(imp_date, INTERVAL ranking DAY) as ds
      FROM (
               SELECT uid, imp_date, ROW_NUMBER() over (PARTITION BY uid ORDER BY imp_date) as "ranking"
               FROM t_act_records) as test) as sub_ds
GROUP BY uid, ds
HAVING COUNT(1) >= 5
;
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:52:47  更:2022-03-13 21:56:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:18:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码