我试图弄清楚正确的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,尝试次数的列表,并且是否已通过。
答案 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;