• 【力扣10天SQL入门】Day7+8 计算函数


    1141.查询近30天活跃用户数

    活动记录表:Activity
    +---------------+---------+
    | Column Name   | Type    |
    +---------------+---------+
    | user_id       | int     |
    | session_id    | int     |
    | activity_date | date    |
    | activity_type | enum    |
    +---------------+---------+
    该表是用户在社交网站的活动记录。该表没有主键,可能包含重复数据。
    activity_type 字段为以下四种值 ('open_session', 'end_session', 'scroll_down', 'send_message')。
    每个 session_id 只属于一个用户。
     
    请写SQL查询出截至 2019-07-27(包含2019-07-27),近 30 天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)。
    以 任意顺序 返回结果表。
    
    输入:
    Activity table:
    +---------+------------+---------------+---------------+
    | user_id | session_id | activity_date | activity_type |
    +---------+------------+---------------+---------------+
    | 1       | 1          | 2019-07-20    | open_session  |
    | 1       | 1          | 2019-07-20    | scroll_down   |
    | 1       | 1          | 2019-07-20    | end_session   |
    | 2       | 4          | 2019-07-20    | open_session  |
    | 2       | 4          | 2019-07-21    | send_message  |
    | 2       | 4          | 2019-07-21    | end_session   |
    | 3       | 2          | 2019-07-21    | open_session  |
    | 3       | 2          | 2019-07-21    | send_message  |
    | 3       | 2          | 2019-07-21    | end_session   |
    | 4       | 3          | 2019-06-25    | open_session  |
    | 4       | 3          | 2019-06-25    | end_session   |
    +---------+------------+---------------+---------------+
    输出:
    +------------+--------------+ 
    | day        | active_users |
    +------------+--------------+ 
    | 2019-07-20 | 2            |
    | 2019-07-21 | 2            |
    +------------+--------------+ 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    答案解析

    限制最近30天的,再按日期分组,统计不同的session_id

    SELECT activity_date day, COUNT(distinct user_id) active_users 
    FROM activity
    WHERE DATEDIFF('2019-07-27', activity_date) < 30 AND DATEDIFF('2019-07-27', activity_date) >= 0
    GROUP BY activity_date
    
    • 1
    • 2
    • 3
    • 4
    SELECT activity_date day, COUNT(distinct user_id) active_users 
    FROM activity
    WHERE activity_date BETWEEN '2019-06-28'  AND '2019-07-27'
    GROUP BY activity_date
    
    • 1
    • 2
    • 3
    • 4

    1693.每天的领导和合伙人

    表:DailySales
    +-------------+---------+
    | Column Name | Type    |
    +-------------+---------+
    | date_id     | date    |
    | make_name   | varchar |
    | lead_id     | int     |
    | partner_id  | int     |
    +-------------+---------+
    该表没有主键。
    该表包含日期、产品的名称,以及售给的领导和合伙人的编号。名称只包含小写英文字母。
     
    写一条 SQL 语句,使得对于每一个 date_id 和 make_name,返回不同的 lead_id 以及不同的 partner_id 的数量。
    按 任意顺序 返回结果表。
    
    输入:
    DailySales 表:
    +-----------+-----------+---------+------------+
    | date_id   | make_name | lead_id | partner_id |
    +-----------+-----------+---------+------------+
    | 2020-12-8 | toyota    | 0       | 1          |
    | 2020-12-8 | toyota    | 1       | 0          |
    | 2020-12-8 | toyota    | 1       | 2          |
    | 2020-12-7 | toyota    | 0       | 2          |
    | 2020-12-7 | toyota    | 0       | 1          |
    | 2020-12-8 | honda     | 1       | 2          |
    | 2020-12-8 | honda     | 2       | 1          |
    | 2020-12-7 | honda     | 0       | 1          |
    | 2020-12-7 | honda     | 1       | 2          |
    | 2020-12-7 | honda     | 2       | 1          |
    +-----------+-----------+---------+------------+
    输出:
    +-----------+-----------+--------------+-----------------+
    | date_id   | make_name | unique_leads | unique_partners |
    +-----------+-----------+--------------+-----------------+
    | 2020-12-8 | toyota    | 2            | 3               |
    | 2020-12-7 | toyota    | 1            | 2               |
    | 2020-12-8 | honda     | 2            | 2               |
    | 2020-12-7 | honda     | 3            | 2               |
    +-----------+-----------+--------------+-----------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    答案解析

    按玩具和日期分组,GROUP BY 可以指定多列

    SELECT date_id, make_name, COUNT(distinct lead_id ) unique_leads,  COUNT(distinct partner_id) unique_partners 
    FROM DailySales
    GROUP BY date_id, make_name
    
    • 1
    • 2
    • 3

    1729.求关注者的数量

    表: Followers
    +-------------+------+
    | Column Name | Type |
    +-------------+------+
    | user_id     | int  |
    | follower_id | int  |
    +-------------+------+
    (user_id, follower_id) 是这个表的主键。
    该表包含一个关注关系中关注者和用户的编号,其中关注者关注用户。
     
    写出 SQL 语句,对于每一个用户,返回该用户的关注者数量。
    按 user_id 的顺序返回结果表。
    
    输入:
    Followers 表:
    +---------+-------------+
    | user_id | follower_id |
    +---------+-------------+
    | 0       | 1           |
    | 1       | 0           |
    | 2       | 0           |
    | 2       | 1           |
    +---------+-------------+
    输出:
    +---------+----------------+
    | user_id | followers_count|
    +---------+----------------+
    | 0       | 1              |
    | 1       | 1              |
    | 2       | 2              |
    +---------+----------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    答案解析

    分组统计即可

    SELECT user_id, COUNT(distinct follower_id) followers_count
    FROM Followers 
    GROUP BY user_id
    
    • 1
    • 2
    • 3

    586.订单最多的客户

    表: Orders
    
    +-----------------+----------+
    | Column Name     | Type     |
    +-----------------+----------+
    | order_number    | int      |
    | customer_number | int      |
    +-----------------+----------+
    Order_number是该表的主键。此表包含关于订单ID和客户ID的信息。
    
    编写一个SQL查询,找下了 最多订单 的客户的customer_number 。
    测试用例生成后, 恰好有一个客户 比任何其他客户下了更多的订单。
    
    输入: 
    Orders 表:
    +--------------+-----------------+
    | order_number | customer_number |
    +--------------+-----------------+
    | 1            | 1               |
    | 2            | 2               |
    | 3            | 3               |
    | 4            | 3               |
    +--------------+-----------------+
    输出: 
    +-----------------+
    | customer_number |
    +-----------------+
    | 3               |
    +-----------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    答案解析

    老套的思路:分组,排序(按分组统计数量降序),找第一个

    SELECT customer_number
    FROM Orders
    GROUP BY customer_number
    ORDER BY COUNT(customer_number) DESC
    LIMIT 0,1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    511.游戏玩法分析I

    活动表 Activity:
    +--------------+---------+
    | Column Name  | Type    |
    +--------------+---------+
    | player_id    | int     |
    | device_id    | int     |
    | event_date   | date    |
    | games_played | int     |
    +--------------+---------+
    表的主键是 (player_id, event_date)。
    这张表展示了一些游戏玩家在游戏平台上的行为活动。
    每行数据记录了一名玩家在退出平台之前,当天使用同一台设备登录平台后打开的游戏的数目(可能是 0 个)。
     
    写一条 SQL 查询语句获取每位玩家 第一次登陆平台的日期。
    
    Activity 表:
    +-----------+-----------+------------+--------------+
    | player_id | device_id | event_date | games_played |
    +-----------+-----------+------------+--------------+
    | 1         | 2         | 2016-03-01 | 5            |
    | 1         | 2         | 2016-05-02 | 6            |
    | 2         | 3         | 2017-06-25 | 1            |
    | 3         | 1         | 2016-03-02 | 0            |
    | 3         | 4         | 2018-07-03 | 5            |
    +-----------+-----------+------------+--------------+
    Result 表:
    +-----------+-------------+
    | player_id | first_login |
    +-----------+-------------+
    | 1         | 2016-03-01  |
    | 2         | 2017-06-25  |
    | 3         | 2016-03-02  |
    +-----------+-------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    答案解析

    用一个min就好了。 分组+min()

    SELECT player_id, min(event_date) first_login
    FROM Activity
    GROUP BY player_id
    
    • 1
    • 2
    • 3

    1890.2020年最后一次登录

    表: Logins
    +----------------+----------+
    | 列名           | 类型      |
    +----------------+----------+
    | user_id        | int      |
    | time_stamp     | datetime |
    +----------------+----------+
    (user_id, time_stamp) 是这个表的主键。(两列主键,组合必须唯一,单独可以不唯一)
    每一行包含的信息是user_id 这个用户的登录时间。
     
    编写一个 SQL 查询,该查询可以获取在 2020 年登录过的所有用户的本年度 最后一次 登录时间。结果集 不 包含 2020 年没有登录过的用户。
    返回的结果集可以按 任意顺序 排列。
    
    输入:
    Logins 表:
    +---------+---------------------+
    | user_id | time_stamp          |
    +---------+---------------------+
    | 6       | 2020-06-30 15:06:07 |
    | 6       | 2021-04-21 14:06:06 |
    | 6       | 2019-03-07 00:18:15 |
    | 8       | 2020-02-01 05:10:53 |
    | 8       | 2020-12-30 00:46:50 |
    | 2       | 2020-01-16 02:49:50 |
    | 2       | 2019-08-25 07:59:08 |
    | 14      | 2019-07-14 09:00:00 |
    | 14      | 2021-01-06 11:59:59 |
    +---------+---------------------+
    输出:
    +---------+---------------------+
    | user_id | last_stamp          |
    +---------+---------------------+
    | 6       | 2020-06-30 15:06:07 |
    | 8       | 2020-12-30 00:46:50 |
    | 2       | 2020-01-16 02:49:50 |
    +---------+---------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    答案解析

    SELECT user_id, MAX(time_stamp) last_stamp 
    FROM Logins
    WHERE time_stamp BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59'
    GROUP BY user_id
    
    • 1
    • 2
    • 3
    • 4

    也可以用year() = 2020

    SELECT user_id, MAX(time_stamp) last_stamp 
    FROM Logins
    WHERE YEAR(time_stamp) = 2020
    GROUP BY user_id
    
    • 1
    • 2
    • 3
    • 4

    1741.查找每个员工花费的总时间

    表: Employees
    
    +-------------+------+
    | Column Name | Type |
    +-------------+------+
    | emp_id      | int  |
    | event_day   | date |
    | in_time     | int  |
    | out_time    | int  |
    +-------------+------+
    (emp_id, event_day, in_time) 是这个表的主键。
    该表显示了员工在办公室的出入情况。
    event_day 是此事件发生的日期,in_time 是员工进入办公室的时间,而 out_time 是他们离开办公室的时间。
    in_time 和 out_time 的取值在1到1440之间。
    题目保证同一天没有两个事件在时间上是相交的,并且保证 in_time 小于 out_time。
    
    编写一个SQL查询以计算每位员工每天在办公室花费的总时间(以分钟为单位)。 返回结果表单的顺序无要求。
    请注意,在一天之内,同一员工是可以多次进入和离开办公室的。 在办公室里一次进出所花费的时间为out_time 减去 in_time。
    
    Employees table:
    +--------+------------+---------+----------+
    | emp_id | event_day  | in_time | out_time |
    +--------+------------+---------+----------+
    | 1      | 2020-11-28 | 4       | 32       |
    | 1      | 2020-11-28 | 55      | 200      |
    | 1      | 2020-12-03 | 1       | 42       |
    | 2      | 2020-11-28 | 3       | 33       |
    | 2      | 2020-12-09 | 47      | 74       |
    +--------+------------+---------+----------+
    Result table:
    +------------+--------+------------+
    | day        | emp_id | total_time |
    +------------+--------+------------+
    | 2020-11-28 | 1      | 173        |
    | 2020-11-28 | 2      | 30         |
    | 2020-12-03 | 1      | 41         |
    | 2020-12-09 | 2      | 27         |
    +------------+--------+------------+
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    答案解析

    直接按event_day和emp_id分组,然后SUM就欧克了

    SELECT event_day day, emp_id, SUM(out_time - in_time) total_time
    FROM Employees 
    GROUP BY event_day, emp_id
    
    • 1
    • 2
    • 3

    总结

    主要是SUM、MIN、MAX、COUNT 的一些用法,需要配合GROUP BY

  • 相关阅读:
    边缘计算网关在智能工业园区中的的应用及其优势-天拓四方
    WebSocket基本使用方法
    ES6 Proxy
    【Qt】桌面应用开发 | 绘图事件和绘图设备 |文件操作
    C++代码转C#代码,制作DLL,以供python调用
    国稻种芯百团计划行动 周文彬:发现水稻高产基因绿色高效
    数据结构大总结:有头单链表、循环链表、双线链表、栈、队列、递归、快速排序、树和哈希。
    APK 签名 v1 v2 步骤
    gRPC 四模式之 一元RPC模式
    数据提取/数据获取/爬虫—工具篇—影刀
  • 原文地址:https://blog.csdn.net/weixin_44179010/article/details/125496313