前提条件:
Signups
+----------------+----------+
| Column Name | Type |
+----------------+----------+
| user_id | int |
| time_stamp | datetime |
+----------------+----------+
User_id是该表的主键。
每一行都包含ID为user_id的用户的注册时间信息。
Confirmations
+----------------+----------+
| Column Name | Type |
+----------------+----------+
| user_id | int |
| time_stamp | datetime |
| action | ENUM |
+----------------+----------+
(user_id, time_stamp)是该表的主键。
user_id是一个引用到注册表的外键。
action是类型为('confirmed', 'timeout')的ENUM
该表的每一行都表示ID为user_id的用户在time_stamp请求了一条确认消息,该确认消息要么被确认('confirmed'),要么被过期('timeout')。
SQL语句
CREATE TABLE Signups (
user_id INT,
time_stamp DATETIME
);
CREATE TABLE Confirmations (
user_id INT,
time_stamp DATETIME,
action ENUM('confirmed', 'timeout')
);
INSERT INTO
Signups
VALUES
(3, '2020-03-21 10:16:13'),
(7, '2020-01-04 13:57:59'),
(2, '2020-07-29 23:09:44'),
(6, '2020-12-09 10:39:37');
INSERT INTO Confirmations
VALUES
(3, '2021-01-06 03:30:46', 'timeout'),
(3, '2021-07-14 14:00:00', 'timeout'),
(7, '2021-06-12 11:57:29', 'confirmed'),
(7, '2021-06-13 12:58:28', 'confirmed'),
(7, '2021-06-14 13:59:27', 'confirmed'),
(2, '2021-01-22 00:00:00', 'confirmed'),
(2, '2021-02-28 23:59:59', 'timeout');
用户的 确认率 是 'confirmed'
消息的数量除以请求的确认消息的总数。没有请求任何确认消息的用户的确认率为 0
。确认率四舍五入到 小数点后两位 。
编写一个SQL查询来查找每个用户的 确认率 ,以 任意顺序 返回结果表。
思路:
- 用AVG()里面加条件实现过滤
优化:
实现:
SELECT
s.user_id user_id,
ROUND(IFNULL(AVG(c.action='confirmed'), 0), 2) confirmation_rate
FROM
Signups s LEFT JOIN Confirmations c ON s.user_id = c.user_id
GROUP BY
s.user_id;
标签:confirmed,确认,leetcode,user,timeout,1934,id,2021 From: https://www.cnblogs.com/kezz/p/18503644