我有一个分组的问题,我似乎搞不清楚。任何建议都将不胜感激!假设我有一张这样的桌子
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我想要完成的是这样的事情:
Name Passed? PlanID
---------------------------
Tom 1 1
Bobby 1 2
Linda 1 3因此,基本上,如果第一个planID尚未通过,请看第二个。如果那个没有通过,看第三个。我遇到的问题是,所有PlanID都是3或1,或者传递列中的所有值都是0。
我尝试过这样的查询:
CASE
WHEN MIN(Passed?) = 1
THEN MIN(PlanID)
ELSE MAX(PlanID)
END我意识到最大值和最小值只会产生3或1,但我不知道还能怎么做。谢谢!
编辑:对不起,忘记提到如果一个人通过了一个planID,那么其余的planID应该读取为传递。因此,由于鲍比第一次没有通过这两项计划,他必须再一次通过。既然他第二次通过了,他就不用再拿第三次了。一个人必须通过两个计划才算通过,如果这是合理的话。我增加了几行,希望能更好地传达我的想法。我可能也把这件事弄得太混乱了。
发布于 2016-03-08 21:10:01
如果有可能看到相同名称的多次传递,而您只想取第一个名称,请使用下面的查询:
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:
select * from table where Passed = 1发布于 2016-03-08 21:07:31
如果返回刚刚通过?=1
select * from table where Passed? = 1返回您想要的
发布于 2016-03-08 21:21:14
您可以使用exists子查询来检查该Name是否存在较小的Name。
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 )https://stackoverflow.com/questions/35877902
复制相似问题