题目内容
问题:计算2021年里有播放记录的每个视频的完播率(结果保留三位小数),并按完播率降序排序
注:视频完播率是指完成播放次数占总播放次数的比例。简单起见,结束观看时间与开始播放时间的差>=视频时长时,视为完成播放。
用户-视频互动表tb_user_video_log
短视频信息表tb_video_info
下面是我的代码,输出用例没问题,但是测试用例不通过,一直测试用例不通过
SELECT
video_id,
ROUND(COUNT(CASE
WHEN SECOND(TIMEDIFF(end_time, start_time)) >= duration THEN 1
ELSE NULL
END) / COUNT(start_time),
3) avg_comp_play_rate
FROM
tb_user_video_log
JOIN
tb_video_info USING (video_id)
WHERE
YEAR(start_time) = 2021
GROUP BY video_id
ORDER BY avg_comp_play_rate DESC;
手动算一下:
第4行数据看的是第2个视频,只看了42秒,小于60秒,所以没看完;
第5行数据,结束时间比开始时间还要早,属于数据异常,也是没看完。
所以结果为0才是正确的,
如果非要让输出结果和期望一致,那就在判断是否大于时长的时候,加个ABS绝对值,那个长度都有59分30秒了
SELECT
video_id,
cast( COUNT(CASE
WHEN datediff(second,start_time,end_time) >= duration THEN 1
ELSE 0
END) / (COUNT(*)*1.00) as decimal(10,3)) avg_comp_play_rate
FROM
tb_user_video_log
JOIN
tb_video_info USING (video_id)
WHERE
YEAR(start_time) = 2021
GROUP BY video_id
ORDER BY avg_comp_play_rate DESC;
count的结果是整数,你2个整数相除,是得不到小数的,你可以试下select 1/3就知道了,所以要给被除数或者除数乘以一个1.00,让其隐式转化为欸小数,后面再转成3位小数。另外,你算时间差的函数都写错了