我正在尝试创建一个重用变量的Rails Postgres查询。
视频有很多活动(想想统计数据)。每个活动记录观看的视频和观看的视频进度(0-100)%
要生成可以分页的视频报告表,我需要查询以获取所有视频观看活动以及每个视频获取 a)总共有多少观点 b)有多少观点的进度(整数)大于或等于90% c)计算观看率超过90%的人的百分比,例如(B / A)×100
下面的代码大致是它应该如何工作(真实代码和sudo代码的组合)
Video.joins(:activities)
.where('occurred_at >= ? AND occurred_at <= ?', @start_time, @end_time)
.select('videos.*, COUNT(activities.id) as total_views, COUNT(activities.progress >= 90) as completed_views, case when total_views = 0 then 0.0 else ROUND( 100.0 *(completion_views/ cast(total_views as float)) ) end as percent_completed')
.group('videos.id')
.page(@page).per(@per_page)
如何在select查询中重用total_views和completed_views变量来创建percent_completed变量并使它们查询工作。我也意识到计算COUNT(activities.progress >= 90) as completed_views
也不正确,我不知道该怎么做。
答案 0 :(得分:1)
您需要在子查询中使用上述查询。
subquery = Video.joins(:activities)
.where('occurred_at >= ? AND occurred_at <= ?', @start_time, @end_time)
.select('videos.*, COUNT(activities.id) as total_views, COUNT(activities.progress >= 90) as completed_views')
.group('videos.id').as('videos')
Video
.select('videos.*, case when total_views = 0 then 0.0 else ROUND( 100.0 *(completion_views/ cast(total_views as float)) ) end as percent_completed')
.from(subquery).page(@page).per(@per_page)
(我只是使用您在上面提供的伪代码,但总体思路是可靠的。)