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