SQL - 逐列获取计数,但也选择组

时间:2017-10-19 17:34:51

标签: sql postgresql group-by

我试图弄清楚正确的sql来完成半复杂的事情。我在这个特定场景中使用postgres,但是也可以使用可以用于其他平台的sql语句。

我有称为用户和响应的表。用户将完成活动,并且对于活动的每次尝试,我们都会跟踪用户的响应以及该响应是否导致活动的通过分数。

相关表格和列:

用户:id(int),username(varchar),classroom_id(int),type(varchar)

回应:id(int),activity_id(int),user_id(int),is_passing_score(bool)

活动:id(int),type(varchar),name(varchar)

我希望能够从这些表中提取的是activity_id,每个活动的尝试次数以及活动是否通过。

select activity_id, count(activity_id)
from (
  select *
  from responses R
  inner join users U on U.id = R.user_id
  where U.classroom_id = '114' AND U.type = 'Student'
  group by R.activity_id, R.id, U.id
  order by activity_id, is_passing_score DESC
) as foo
group by activity_id
order by activity_id

以上查询将获取activity_id和尝试次数,但是我也在努力获取是否有任何响应导致传递的活动(通过is_passing_score列)。如果任何响应将is_passing_score设置为true,则会出现这种情况。

我也尝试了类似这样的事情,我认为这可以让我得到真实/错误的价值,我正在寻找活动是否通过。

select rn, * 
from (
  select row_number() OVER(PARTITION BY activity_id ORDER BY is_passing_score DESC) AS rn, *
  from responses R
  inner join users U on U.id = R.user_id
  where U.classroom_id = '114' AND U.type = 'Student'
  group by R.activity_id, R.id, U.id
  order by activity_id, is_passing_score DESC
) as foo
WHERE rn = '1'
order by activity_id

我认为查询将通过is_passing_score对子查询进行排序,然后只抓取顶部的一个,如果它的真实那样,否则如果它只是假的那么。我的大问题是,如果第二个查询实际上是正确的,那就是得到count和true / false值。我觉得我关闭它只是能够进行行选择并在一个查询中获得计数。

我希望我的最终结果是activity_id,user_id,尝试次数的列表,并且是否已通过。

  • activity_id,user_id,传递,尝试
  • 17,3069,t,2
  • 18,3069,t,3
  • 151,3069,t,1
  • 152,3069,t,4

1 个答案:

答案 0 :(得分:2)

我想你想要这样的东西:

SELECT r.activity_id, count(*) AS num_attempts,
       CAST(MAX(CAST(is_passing_score AS INT)) AS BOOL) AS has_passed
FROM responses r INNER JOIN
     users u
     ON u.id = r.user_id
WHERE u.classroom_id = 114 AND u.type = 'Student'
GROUP BY r.activity_id;