[SQL智慧航行者] - 查询回答率最高的问题

话不多说, 先看数据表信息.

数据表信息:

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为空(null);
  • q_num是问题的数字序号。
+-----+---------+-------------+-----------+-------+-----------+
| 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  			|
+-----+---------+-------------+-----------+-------+-----------+

话不多说, 再看需求~

需求:

写一条sql语句找出回答率(show 出现次数 / answer 出现次数)最高的 question_id。
预计结果输出如下:

+----+----------+
| question_id   |
+----+----------+
| 285           |
+----+----------+

话不多说, 进行拆解~

拆解:

这里的想法是使用case when函数根据条件进行设置, 再结合对题目编号question_id进行分组聚合得到最后的结果.

select t.question_id
from (
select question_id,
case action when 'show' then 1 else 0 end as show_num,
case action when 'answer' then 1 else 0 end as answer_num
from survey_log
) as t 
group by t.question_id
order by sum(t.show_num) / sum(t.answer_num) desc 
limit 1 
;

结果如下:
image.png

最后给大家介绍一下我这边的创建数据表和插入数据的操作步骤, 想要自己测试的话, 可以参考:

CREATE TABLE survey_log (
    uid INT,
    action VARCHAR(50),
    question_id INT,
    answer_id INT,
    q_num INT,
    timestamp INT
);

INSERT INTO survey_log (uid, action, question_id, answer_id, q_num, timestamp)
VALUES (5, 'show', 285, NULL, 1, 123),
       (5, 'answer', 285, 124124, 1, 124),
       (5, 'show', 369, NULL, 2, 125),
       (5, 'skip', 369, NULL, 2, 126);

数据信息如下:
image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

统计小白er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值