首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL:如何从学生表中选择pass行,以防在postgresql中重新进行考试?

SQL:如何从学生表中选择pass行,以防在postgresql中重新进行考试?
EN

Stack Overflow用户
提问于 2019-05-15 09:42:08
回答 6查看 76关注 0票数 0

假设我有一个表格,里面有学生的数据和他们的结果。

代码语言:javascript
运行
复制
ID  Result
1   PASS
2   PASS
3   PASS
3   FAIL
4   PASS
4   FAIL
4   FAIL
5   FAIL
5   FAIL
5   FAIL

我想为每个学生选择一行,如果他们通过了,我希望pass行返回,但是如果没有,那么返回一个失败的行。

这是预期的结果:

代码语言:javascript
运行
复制
ID  Result
1   PASS
2   PASS
3   PASS
4   PASS
5   FAIL

注:学生可以根据自己的意愿多次重新参加考试,直到他们通过考试或放弃考试。

谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-05-15 09:51:46

做一个GROUP BY。由于PASS (总是)大于FAIL,所以使用MAX()

代码语言:javascript
运行
复制
select ID, max(Result)
from tablename
group by ID
票数 3
EN

Stack Overflow用户

发布于 2019-05-15 09:53:27

在这种情况下,一个获得最大结果的简单group by id就可以了:

代码语言:javascript
运行
复制
select 
  id,
  max(result) result
from tablename
group by id

演示

结果:

代码语言:javascript
运行
复制
> id | result
> -: | :-----
>  1 | PASS  
>  2 | PASS  
>  3 | PASS  
>  4 | PASS  
>  5 | FAIL 
票数 1
EN

Stack Overflow用户

发布于 2019-05-15 09:44:25

使用相关的子查询和联合

代码语言:javascript
运行
复制
select id,result from tbl
where result='pass'
union 
select id,result from tbl
where not exists( select 1 from tbl t2 where t1.id=t2id 
                    and result='pass')

或者您可以使用row_number()解析函数

代码语言:javascript
运行
复制
select id,result from
(select id,result,
  row_number() over(partition by id order by case when result='pass' then 1 else 2 end) rn
 ) where rn=1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56146235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档