[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

猜你喜欢

转载自www.cnblogs.com/coding-gaga/p/12900583.html