99,SQL训练之,力扣,578. 查询回答率最高的问题

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,SQL解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

SurveyLog 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| action      | ENUM |
| question_id | int  |
| answer_id   | int  |
| q_num       | int  |
| timestamp   | int  |
+-------------+------+
这张表可能包含重复项。
action 是一个 ENUM(category) 数据,可以是 "show"、"answer" 或者 "skip" 。
这张表的每一行表示:ID = id 的用户对 question_id 的问题在 timestamp 时间进行了 action 操作。
如果用户对应的操作是 "answer" ,answer_id 将会是对应答案的 id ,否则,值为 null 。
q_num 是该问题在当前会话中的数字顺序。

回答率 是指:同一问题编号中回答次数占显示次数的比率。

编写一个解决方案以报告 回答率 最高的问题。如果有多个问题具有相同的最大 回答率 ,返回 question_id 最小的那个。

查询结果如下例所示。

示例 1:

输入:
SurveyLog table:
+----+--------+-------------+-----------+-------+-----------+
| id | 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 次。回答率为 1.0 。
问题 369 显示 1 次、回答 0 次。回答率为 0.0 。
问题 285 回答率最高。

三,建表语句

Create table If Not Exists SurveyLog (id int, action varchar(255), question_id int, answer_id int, q_num int, timestamp int)
Truncate table SurveyLog
insert into SurveyLog (id, action, question_id, answer_id, q_num, timestamp) values ('5', 'show', '285', NULL, '1', '123')
insert into SurveyLog (id, action, question_id, answer_id, q_num, timestamp) values ('5', 'answer', '285', '124124', '1', '124')
insert into SurveyLog (id, action, question_id, answer_id, q_num, timestamp) values ('5', 'show', '369', NULL, '2', '125')
insert into SurveyLog (id, action, question_id, answer_id, q_num, timestamp) values ('5', 'skip', '369', NULL, '2', '126')

四,分析

题解:

表:调查日志

表字段:日志id,问题状态,问题ID,问题答案,问题会话顺序,问题回答时间

求 回答率最高的问题,如果有多个 就取问题id最小的那个

问题回答率: 每个问题的回答次数/每个问题的显示次数

第一步 扁平化表格  以问题分组 然后求和 该问题回答过的列 和该问题显示的列

    select question_id,
       sum(if(action='show',1,0)) as show_cnt,
       sum(if(action='answer',1,0)) as anser_cnt
from SurveyLog group by question_id

第二步,计算问题回答率

with t1 as (
    select question_id,
       sum(if(action='show',1,0)) as show_cnt,
       sum(if(action='answer',1,0)) as anser_cnt
from SurveyLog group by question_id
),t2 as (
select
    question_id, show_cnt, anser_cnt,
    anser_cnt/show_cnt as huidalv
    from t1
)
   select * from t2;

最后一步 取回答率最高的行  如果有多行 就以问题排序 limit取第一

五,SQL解答

with t1 as (
    select question_id,
       sum(if(action='show',1,0)) as show_cnt,
       sum(if(action='answer',1,0)) as anser_cnt
from SurveyLog group by question_id
),t2 as (
select
    question_id, show_cnt, anser_cnt,
    anser_cnt/show_cnt as huidalv
    from t1
)
#    select * from t2;
   ,t3 as (
    select question_id, show_cnt, anser_cnt, huidalv,
       dense_rank()over(order by huidalv desc ) rn
    from t2
)
select question_id from t3 where rn=1 order by question_id limit 1;

六,验证

七,知识点总结

  • 扁平化表格,如果以一个单元格判断求另外一个结果的时候
  • 分组求top1的运用
  • 排序的运用

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值