题目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