首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL分组计算

问SQL分组计算
EN

Stack Overflow用户
提问于 2016-03-08 20:59:57
回答 5查看 54关注 0票数 0

我有一个分组的问题,我似乎搞不清楚。任何建议都将不胜感激!假设我有一张这样的桌子

代码语言:javascript
复制
Name     Passed?     PlanID      Plan
-----------------------------------------
Tom         1          1         Math
Tom         1          1         Reading
Tom         0          2         Math
Tom         0          2         Reading 
Tom         0          3         Math
Tom         0          3         Reading
Bobby       1          1         Math
Bobby       0          1         Reading
Bobby       1          2         Math
Bobby       1          2         Reading
Bobby       0          3         Math
Bobby       0          3         Reading
Linda       0          1         Math
Linda       1          1         Reading
Linda       0          2         Math
Linda       1          2         Reading
Linda       1          3         Math
Linda       1          3         Reading

我想要完成的是这样的事情:

代码语言:javascript
复制
Name     Passed?     PlanID
---------------------------
Tom         1          1
Bobby       1          2
Linda       1          3

因此,基本上,如果第一个planID尚未通过,请看第二个。如果那个没有通过,看第三个。我遇到的问题是,所有PlanID都是3或1,或者传递列中的所有值都是0。

我尝试过这样的查询:

代码语言:javascript
复制
CASE
    WHEN MIN(Passed?) = 1
    THEN MIN(PlanID)
    ELSE MAX(PlanID)
    END

我意识到最大值和最小值只会产生3或1,但我不知道还能怎么做。谢谢!

编辑:对不起,忘记提到如果一个人通过了一个planID,那么其余的planID应该读取为传递。因此,由于鲍比第一次没有通过这两项计划,他必须再一次通过。既然他第二次通过了,他就不用再拿第三次了。一个人必须通过两个计划才算通过,如果这是合理的话。我增加了几行,希望能更好地传达我的想法。我可能也把这件事弄得太混乱了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-08 21:10:01

如果有可能看到相同名称的多次传递,而您只想取第一个名称,请使用下面的查询:

代码语言:javascript
复制
select pass.name, pass.passed, pass.planID
from 
(Select name, passed, planID
from table
where passed = 1) pass, 
(Select name, min(planID) planId
from table
where passed = 1) min
where pass.planID= min.planID and pass.name = min.name

如果只有一次,您只需选择pass:

代码语言:javascript
复制
select * from table where Passed = 1
票数 0
EN

Stack Overflow用户

发布于 2016-03-08 21:07:31

如果返回刚刚通过?=1

代码语言:javascript
复制
select * from table where Passed? = 1

返回您想要的

票数 0
EN

Stack Overflow用户

发布于 2016-03-08 21:21:14

您可以使用exists子查询来检查该Name是否存在较小的Name。

代码语言:javascript
复制
 SELECT *
 FROM YourTable T1
 WHERE Passed = 1 
   AND NOT EXISTS (SELECT 1
                   FROM YourTable T2
                   WHERE T1.Name = T2.Name
                     AND T1.planID > T2.planID
                     AND T2.Passed  = 1 )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35877902

复制
相关文章

相似问题

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