zoukankan      html  css  js  c++  java
  • [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
    
  • 相关阅读:
    9、Spring Boot 2.x 集成 Thymeleaf
    【专题】Spring Boot 2.x 面试题
    8、Spring Boot 2.x 服务器部署
    7、Spring Boot 2.x 集成 Redis
    6、Spring Boot 2.x 集成 MyBatis
    5、Spring Boot 2.x 启动原理解析
    4、Spring Boot 2.x 自动配置原理
    3、Spring Boot 2.x 核心技术
    2、Spring Boot 2.x 快速入门
    centOS下安装JDK1.8.60,glassfish4.1.1以及MySQL
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12900583.html
Copyright © 2011-2022 走看看