我为LeetCode问题编写了以下解决方案:
SELECT ROUND(1.0*sum(t1.accepted_requests)/sum(t2.total_requests), 2) AS accept_rate
FROM (SELECT 'cool' AS common, ra.accepter_id, COUNT(DISTINCT ra.requester_id) AS accepted_requests
FROM request_accepted ra
GROUP BY 1, 2) AS t1
JOIN
(SELECT 'cool' AS common, fr.send_to_id, COUNT(DISTINCT fr.sender_id) AS total_requests
FROM friend_request fr
GROUP BY 1, 2) AS t2
ON t1.common = t2.common
我运行了查询,输出与LeetCode发布的预期答案相同。但是,LeetCode的算法说我的查询是错误的,我不知道为什么。
LeetCode问题描述如下:
在诸如Facebook或Twitter的社交网络中,人们发送朋友请求并接受他人的请求。现在给出两个表,如下所示:
编写查询以找到四舍五入到2位小数的请求的总体接受率,这是接受数除以请求数。
Note:
接受的请求不一定来自表friend_request。在这种情况下,您只需要简单地计算已接受的请求总数(无论它们是否在原始请求中),然后将其除以请求数即可得出接受率。
发送者有可能将多个请求发送到同一接收者,并且一个请求可能被多次接受。在这种情况下,“重复”的请求或接受仅计一次。
如果根本没有任何请求,则应返回0.00作为accept_rate。
说明:共有4个唯一的接受请求,总共有5个请求。比率是0.80。
答案 0 :(得分:1)
有4个唯一的已接受请求,总共5个请求。比率是0.80。
我想这个查询应该做到这一点:
SELECT
ROUND(COALESCE(acc.cnt/NULLIF(req.cnt, 0), 0), 2)
FROM
(SELECT COUNT(*) cnt FROM friends_request) req,
(SELECT COUNT(DISTINCT requester_id, accepter_id) cnt FROM request_accepted) acc
查询的作用只是使用两个子查询来计算在外部查询中执行的除法的两个部分:
req
计算分母,即请求总数acc
计算分子,即不同的已接受请求的数量我在this db fiddle中对其进行了测试,它正确返回了0.80
作为您的测试数据。