Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-按列获取组的计数,但也选择组的顶部项_Sql_Postgresql_Group By - Fatal编程技术网

SQL-按列获取组的计数,但也选择组的顶部项

SQL-按列获取组的计数,但也选择组的顶部项,sql,postgresql,group-by,Sql,Postgresql,Group By,我正试图找出合适的sql来完成一些半复杂的事情。我在这个特定的场景中使用postgres,但是如果有一个sql语句可以用于其他平台,我也会非常感激 我有称为用户和响应的表。用户将完成活动,对于活动的每次尝试,我们将跟踪用户的响应,以及该响应是否导致活动的及格分数 相关表格和列: 用户:id(int)、用户名(varchar)、教室id(int)、类型(varchar) 回答:id(int)、活动id(int)、用户id(int)、是否通过评分(bool) 活动:id(int)、类型(varcha

我正试图找出合适的sql来完成一些半复杂的事情。我在这个特定的场景中使用postgres,但是如果有一个sql语句可以用于其他平台,我也会非常感激

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

相关表格和列:

用户:id(int)、用户名(varchar)、教室id(int)、类型(varchar)

回答:id(int)、活动id(int)、用户id(int)、是否通过评分(bool)

活动:id(int)、类型(varchar)、名称(varchar)

我希望能够从这些表中提取活动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_分数设置为true,则为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_分数对子查询排序,然后只获取最上面的一个,如果它为真,那么它就是,如果它为假,那么不管怎样。如果第二个查询实际上是正确的,那么我的大问题是获取计数和真/假值。我觉得我很接近了,这只是一个能够进行行选择并在一个查询中获得计数的问题

我希望我的最终结果是一个活动id、用户id、尝试次数以及是否通过的列表

  • 活动id、用户id、已通过、尝试次数
  • 17,3069,t,2
  • 183069,t,3
  • 1513069,t,1
  • 1523069,t,4

    • 我想你想要这样的东西:

      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;
      

      我想你想要这样的东西:

      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;
      

      样本数据和期望的结果真的会有帮助。如果有必要,我可以尝试提供更多样本数据,只是不确定最好的方法。样本数据和期望的结果真的会有帮助。如果有必要,我可以尝试提供更多样本数据,只是不确定最好的方法。我尝试了,但是最大值(是否通过评分)失败,因为is_passing_分数为布尔值。确切的错误:“函数max(boolean)不存在”实际上,如果我将is_passing_分数转换为一个可能工作的int,我尝试了,但是max(is_passing_分数)失败了,因为is_passing_分数是一个boolean。如果我将is_passing_分数转换为一个可能有效的int,则确切的错误是:“函数max(boolean)不存在”