• [Leetcode]Sql系列3


    题目1

    产品数据表: Products
    
    +---------------+---------+
    | Column Name   | Type    |
    +---------------+---------+
    | product_id    | int     |
    | new_price     | int     |
    | change_date   | date    |
    +---------------+---------+
    这张表的主键是 (product_id, change_date)。
    这张表的每一行分别记录了 某产品 在某个日期 更改后 的新价格。
     
    
    写一段 SQL来查找在 2019-08-16 时全部产品的价格,假设所有产品在修改前的价格都是 10。
    
    查询结果格式如下例所示:
    
    Products table:
    +------------+-----------+-------------+
    | product_id | new_price | change_date |
    +------------+-----------+-------------+
    | 1          | 20        | 2019-08-14  |
    | 2          | 50        | 2019-08-14  |
    | 1          | 30        | 2019-08-15  |
    | 1          | 35        | 2019-08-16  |
    | 2          | 65        | 2019-08-17  |
    | 3          | 20        | 2019-08-18  |
    +------------+-----------+-------------+
    
    Result table:
    +------------+-------+
    | product_id | price |
    +------------+-------+
    | 2          | 50    |
    | 1          | 35    |
    | 3          | 10    |
    +------------+-------+
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/product-price-at-a-given-date
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    

    题解

    分别查询2019-08-16前更新过价格的 和未更新价格的(赋值10)
    然后union一下

    相关

    • 体会where子查询和子查询中使用group by 的方式。
      一般,
    select 想要的字段
    from 表1
    where (字段1,字段2) in (
          select 字段1,聚合函数(字段2)as 字段2别名
          from 表1
          group by 字段1 
    )
    
    • select 字段 和 where 的字段不需要有包含关系。

    • union 的两张表不用加(),union后的表要起别名

    代码

    # Write your MySQL query statement below
    select * from
    (
        select product_id, new_price as price
        from Products
        where (product_id,change_date) in(
            select product_id,Max(change_date)
            from Products
            where change_date <= '2019-08-16'
            group by product_id)
    union
        select product_id, 10 as price
        from Products
        where product_id not in (
            select product_id 
            from Products
            where change_date <= '2019-08-16'
        )
    ) tempTable
    order by product_id
    

    题目2

    Traffic 表:
    
    +---------------+---------+
    | Column Name   | Type    |
    +---------------+---------+
    | user_id       | int     |
    | activity      | enum    |
    | activity_date | date    |
    +---------------+---------+
    该表没有主键,它可能有重复的行。
    activity 列是 ENUM 类型,可能取 ('login', 'logout', 'jobs', 'groups', 'homepage') 几个值之一。
     
    
    编写一个 SQL 查询,以查询从今天起最多 90 天内,每个日期该日期首次登录的用户数。假设今天是 2019-06-30.
    
    查询结果格式如下例所示:
    
    Traffic 表:
    +---------+----------+---------------+
    | user_id | activity | activity_date |
    +---------+----------+---------------+
    | 1       | login    | 2019-05-01    |
    | 1       | homepage | 2019-05-01    |
    | 1       | logout   | 2019-05-01    |
    | 2       | login    | 2019-06-21    |
    | 2       | logout   | 2019-06-21    |
    | 3       | login    | 2019-01-01    |
    | 3       | jobs     | 2019-01-01    |
    | 3       | logout   | 2019-01-01    |
    | 4       | login    | 2019-06-21    |
    | 4       | groups   | 2019-06-21    |
    | 4       | logout   | 2019-06-21    |
    | 5       | login    | 2019-03-01    |
    | 5       | logout   | 2019-03-01    |
    | 5       | login    | 2019-06-21    |
    | 5       | logout   | 2019-06-21    |
    +---------+----------+---------------+
    
    Result 表:
    +------------+-------------+
    | login_date | user_count  |
    +------------+-------------+
    | 2019-05-01 | 1           |
    | 2019-06-21 | 2           |
    +------------+-------------+
    请注意,我们只关心用户数非零的日期.
    ID 为 5 的用户第一次登陆于 2019-03-01,因此他不算在 2019-06-21 的的统计内。
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/new-users-daily-count
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    

    题解

    找到每个用户第一次登陆时间,
    再从中找在时间范围内的,并统计每日登陆用户数

    相关

    Mysql函数:日期相差在90日之内:datediff('2019-06-30',login_date)<=90

    代码

    # Write your MySQL query statement below
    select login_date, count(user_id) as user_count
    from(
        select user_id, min(activity_date) as login_date
        from Traffic
        where activity='login' 
        group by user_id
        having datediff('2019-06-30',login_date)<=90
    ) temp
    group by login_date
    order by login_date
    
  • 相关阅读:
    【css3】使用filter属性实现改变svg图标颜色
    Live CD
    Linux定时任务 crontab(-l -e)、at、batch
    linux图形界面 KDE、GNOME
    shell脚本3——调试
    shell脚本2——控制语句
    bash:双引号和单引号
    shell脚本1——变量 $、read、``
    SSH
    Linux关机、重启、退出
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12900583.html
Copyright © 2020-2023  润新知