LeetCode刷题-数据库(MySQL)-578. 查询回答率最高的问题

578. 查询回答率最高的问题

一、题目描述

从 survey_log 表中获得回答率最高的问题,survey_log 表包含这些列:uid, action, question_id, answer_id, q_num, timestamp。

uid 表示用户 id;action 有以下几种值:“show”,“answer”,“skip”;当 action 值为 “answer” 时 answer_id 非空,而 action 值为 “show” 或者 “skip” 时 answer_id 为空;q_num 表示当前会话中问题的编号。

请编写SQL查询来找到具有最高回答率的问题。

示例:

输入:

uid action question_id answer_id q_num timestamp
5 show 285 null 1 123
5 answer 285 124124 1 124
5 show 369 null 2 125
5 skip 369 null 2 126

输出:

survey_log
285

解释:
问题285的回答率为 1/1,而问题369回答率为 0/1,因此输出285。

注意: 回答率最高的含义是:同一问题编号中回答(answer)数占显示(show)数的比例。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/get-highest-answer-rate-question
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析

本题出得其实有点坑。需要看明白表survey_log记录的到底是什么。该表记录的是每个选手答题的流程:题目出现(show)-回答(answer)/跳过(skip)-下一题出现(show)-回答(answer)/跳过(skip)……每个题目出现(show)以后,选手只能从回答(answer)或者跳过(skip)中选择一种对该题进行应对,要么回答(answer),要么跳过(skip)。回答或跳过以后,再进入下一题。

题目最下方有对答题率的定义:题目回答(answer)数占题目出现(show)数的比例。

三、代码实现

SELECT question_id as survey_log
FROM
(
	SELECT question_id,
		SUM(case when action = "answer" THEN 1 ELSE 0 END) as num_answers,
		SUM(case when action = "show" THEN 1 ELSE 0 END) as num_shows
	FROM survey_log
	GROUP BY question_id
) as tbl
ORDER BY (num_answers / num_shows) DESC
LIMIT 1;

你可能感兴趣的:(MySQL)