中级农民
- 积分
- 112
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-8-29
- 最后登录
- 1970-1-1
|
507. Friend Requests I: Overall Acceptance Rate
/*acceptance rate = # acceptance divide # requests in a given time period. leetcode上跑不出来,select语句报syntax error....求高人指点!*/
SELECT ROUND(IFNULL((COUNT DISTINCT a.requester_id, a.accepter_id)/(COUNT DISTINCT r.sender_id, r.send_to_id), 0), 2) as accept_rate
FROM friend_request r LEFT JOIN request_accepted a
ON r.sender_id = a.requester_id AND r.send_to_id = a.accepter_id
/*网上搜到的解法:这里是求overall rate,且强调accepted requests are not necessarily from request table,所以不需join,两表分别select做count即可*/. 1point 3 acres
SELECT ROUND(IFNULL(SELECT COUNT(DISTINCT requester_id, accepter_id) FROM request_accepted)/SELECT COUNT(DISTINCT sender_id, send_to_id) FROM friend_request), 0), 2) as accept_rate
/*follow-up: accept rate for every month*/
网上的解法,还是分别从两表select count,但要取二者共有的month,用month函数做截取,然后用其中一个month做group by.
SELECT ROUND(IFNULL(a.accepted_cnt/r.request_cnt, 0), 2) as accept_rate, r.month. Waral dи,
FROM (SELECT COUNT(DISTINCT requester_id, accepter_id) as accepted_cnt, MONTH(request_date) as month FROM request_accepted) a
JOIN (SELECT COUNT(DISTINCT sender_id, send_to_id) as request_cnt, MONTH(accept_date) as month FROM friend_request) r
ON a.month = r.month. .и
GROUP BY a.month
既然leetcode上没有答案,就放上我自己的解法继续求一波指点……
SELECT DATE_FORMAT(accept_date, ‘%Y-%m’) as month, IFNULL(ROUND(COUNT (DISTINCT a.requester_id, a.accepter_id) / COUNT(DISTINCT r.sender_id, r.send_to_id) as accep_rate), 2), 0)
FROM friend_request r LEFT JOIN request_accepted a
ON r.sender_id = a.requester_id AND r.send_to_id = a.accepter_id
GROUP BY DATE_TRUNC(‘MONTH’, a.accept_date)
/*follow-up: cumulative accept rate for every day*/
/*cumulative: 对每一天,计算截至这一天之前的total accept number/request number。疑问:用union来取两表时间的并集,不一定能够覆盖到每一天,那么如何将表中没有的date也加入date column?aka.如何新建一列在指定范围内auto-increment的时间列?*/
SELECT dates.date, ROUND(IFNULL(COUNT(DISTINCT a.requester_id, accepter_id)/COUNT(DISTINCT r.sender_id, r,send_to_id), 0), 2) as accept_rate
FROM friend_request r JOIN request_accepted a
JOIN (SELECT request_date as date FROM r
UNION SELECT accept_date as date FROM a
ORDER BY date) dates
ON r.sender_id = a.requester_id AND r.send_to_id = a.accepter_id . 1point 3 acres
AND r.request_date <= dates.date AND a.accept_date <= dates.date
GROUP BY dates.date
|
|