繁体   English   中英

使用Postgres变量用法的Rails查询

[英]Rails query with Postgres variable usage

我正在尝试创建一个重用变量的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)

如何在选择查询中重用变量total_views和completed_views来创建percent_completed变量并使它们查询工作。 我也意识到计算COUNT(activities.progress >= 90) as completed_views也不正确,所以我不确定该怎么做。

您需要在子查询中使用以上查询。

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)

(我只是使用您在上面提供的伪代码,但是总体思路是可靠的。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM