美文网首页
sql复习强化每日五题——第三天

sql复习强化每日五题——第三天

作者: 如虎添 | 来源:发表于2020-10-29 22:36 被阅读0次
    编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
    
    +----+------------------+
    | Id | Email            |
    +----+------------------+
    | 1  | john@example.com |
    | 2  | bob@example.com  |
    | 3  | john@example.com |
    +----+------------------+
    Id 是这个表的主键。
    例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:
    
    +----+------------------+
    | Id | Email            |
    +----+------------------+
    | 1  | john@example.com |
    | 2  | bob@example.com  |
    +----+------------------+
     
    提示:
    执行 SQL 之后,输出是整个 Person 表。
    使用 delete 语句。
    
    答案
    delete a from Person a,Person b where a.Email = b.Email and a.Id>b.Id
    
    给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
    
    +---------+------------------+------------------+
    | Id(INT) | RecordDate(DATE) | Temperature(INT) |
    +---------+------------------+------------------+
    |       1 |       2015-01-01 |               10 |
    |       2 |       2015-01-02 |               25 |
    |       3 |       2015-01-03 |               20 |
    |       4 |       2015-01-04 |               30 |
    +---------+------------------+------------------+
    例如,根据上述给定的 Weather 表格,返回如下 Id:
    
    +----+
    | Id |
    +----+
    |  2 |
    |  4 |
    +----+
    
    答案
    SELECT 
        w2.Id 
    FROM 
        Weather w1, 
        Weather w2 
    WHERE 
        DATEDIFF(w2.RecordDate, w1.RecordDate) = 1 
    AND 
        w1.Temperature < w2.Temperature
    
    Trips 表中存所有出租车的行程信息。每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。Status 是枚举类型,枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。
    
    +----+-----------+-----------+---------+--------------------+----------+
    | Id | Client_Id | Driver_Id | City_Id |        Status      |Request_at|
    +----+-----------+-----------+---------+--------------------+----------+
    | 1  |     1     |    10     |    1    |     completed      |2013-10-01|
    | 2  |     2     |    11     |    1    | cancelled_by_driver|2013-10-01|
    | 3  |     3     |    12     |    6    |     completed      |2013-10-01|
    | 4  |     4     |    13     |    6    | cancelled_by_client|2013-10-01|
    | 5  |     1     |    10     |    1    |     completed      |2013-10-02|
    | 6  |     2     |    11     |    6    |     completed      |2013-10-02|
    | 7  |     3     |    12     |    6    |     completed      |2013-10-02|
    | 8  |     2     |    12     |    12   |     completed      |2013-10-03|
    | 9  |     3     |    10     |    12   |     completed      |2013-10-03| 
    | 10 |     4     |    13     |    12   | cancelled_by_driver|2013-10-03|
    +----+-----------+-----------+---------+--------------------+----------+
    Users 表存所有用户。每个用户有唯一键 Users_Id。Banned 表示这个用户是否被禁止,Role 则是一个表示(‘client’, ‘driver’, ‘partner’)的枚举类型。
    
    +----------+--------+--------+
    | Users_Id | Banned |  Role  |
    +----------+--------+--------+
    |    1     |   No   | client |
    |    2     |   Yes  | client |
    |    3     |   No   | client |
    |    4     |   No   | client |
    |    10    |   No   | driver |
    |    11    |   No   | driver |
    |    12    |   No   | driver |
    |    13    |   No   | driver |
    +----------+--------+--------+
    写一段 SQL 语句查出 2013年10月1日 至 2013年10月3日 期间非禁止用户的取消率。基于上表,你的 SQL 语句应返回如下结果,取消率(Cancellation Rate)保留两位小数。
    
    取消率的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)
    
    +------------+-------------------+
    |     Day    | Cancellation Rate |
    +------------+-------------------+
    | 2013-10-01 |       0.33        |
    | 2013-10-02 |       0.00        |
    | 2013-10-03 |       0.50        |
    +------------+-------------------+
    
    
    答案
    select 
        Request_at as Day,
        round(sum(if(Status="completed",0,1))/count(Status),2) as "Cancellation Rate" 
    from
    ( 
        select 
            *
        from 
            Trips a left join Users b 
        on 
            b.Banned = 'Yes' and 
            (a.Client_Id = b.Users_Id or a.Driver_Id = b.Users_Id)
        where 
            Role is null 
    ) t 
    group by 
        Request_at 
    having 
        Request_at >= '2013-10-01' and 
        Request_at <= '2013-10-03'
    
    Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
    
    +----+-------+--------+--------------+
    | Id | Name  | Salary | DepartmentId |
    +----+-------+--------+--------------+
    | 1  | Joe   | 70000  | 1            |
    | 2  | Jim   | 90000  | 1            |
    | 3  | Henry | 80000  | 2            |
    | 4  | Sam   | 60000  | 2            |
    | 5  | Max   | 90000  | 1            |
    +----+-------+--------+--------------+
    Department 表包含公司所有部门的信息。
    
    +----+----------+
    | Id | Name     |
    +----+----------+
    | 1  | IT       |
    | 2  | Sales    |
    +----+----------+
    编写一个 SQL 查询,找出每个部门工资最高的员工。对于上述表,您的 SQL 查询应返回以下行(行的顺序无关紧要)。
    
    +------------+----------+--------+
    | Department | Employee | Salary |
    +------------+----------+--------+
    | IT         | Max      | 90000  |
    | IT         | Jim      | 90000  |
    | Sales      | Henry    | 80000  |
    +------------+----------+--------+
    解释:
    Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。
    
    答案
    select 
        Department,
        Employee,
        Salary 
    from 
    (
        select 
            dmt.Name as Department,
            emp.Name as Employee,
            emp.Salary,
        dense_rank() over
            (
                partition by emp.DepartmentId 
                order by emp.Salary DESC
            ) as _rank 
        from Employee emp left join Department dmt 
        on emp.DepartmentId = dmt.Id
    ) t
    where _rank = 1 and Department != "" 
    
    表:Stadium
    +---------------+---------+
    | Column Name   | Type    |
    +---------------+---------+
    | id            | int     |
    | visit_date    | date    |
    | people        | int     |
    +---------------+---------+
    visit_date 是表的主键
    每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)
    每天只有一行记录,日期随着 id 的增加而增加
     
    
    编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。
    
    返回按 visit_date 升序排列的结果表。
    
    查询结果格式如下所示。
    
    Stadium table:
    +------+------------+-----------+
    | id   | visit_date | people    |
    +------+------------+-----------+
    | 1    | 2017-01-01 | 10        |
    | 2    | 2017-01-02 | 109       |
    | 3    | 2017-01-03 | 150       |
    | 4    | 2017-01-04 | 99        |
    | 5    | 2017-01-05 | 145       |
    | 6    | 2017-01-06 | 1455      |
    | 7    | 2017-01-07 | 199       |
    | 8    | 2017-01-09 | 188       |
    +------+------------+-----------+
    
    Result table:
    +------+------------+-----------+
    | id   | visit_date | people    |
    +------+------------+-----------+
    | 5    | 2017-01-05 | 145       |
    | 6    | 2017-01-06 | 1455      |
    | 7    | 2017-01-07 | 199       |
    | 8    | 2017-01-09 | 188       |
    +------+------------+-----------+
    id 为 5、6、7、8 的四行 id 连续,并且每行都有 >= 100 的人数记录。
    请注意,即使第 7 行和第 8 行的 visit_date 不是连续的,输出也应当包含第 8 行,因为我们只需要考虑 id 连续的记录。
    不输出 id 为 2 和 3 的行,因为至少需要三条 id 连续的记录。
    
    答案
    with tmp as (
                select
                    *,
                    abs(cast(row_num as signed)-cast(id as signed)) rk
                from
                    (
                        select
                            *,
                            row_number() over(partition by pid) row_num
                        from
                            (
                                select
                                    *,
                                    1 pid
                                from
                                    Stadium
                                where people>=100
                            ) t1
                    ) t2
                );
    
    select
        id,
        visit_date,
        people
    from
        tmp
    where rk in (
        select rk from tmp group by rk having count(*)>=3
    );
    

    相关文章

      网友评论

          本文标题:sql复习强化每日五题——第三天

          本文链接:https://www.haomeiwen.com/subject/yupfuktx.html