SQL分组计算

时间:2016-03-08 20:59:57

标签: sql group-by case

我有这个分组问题,我似乎无法弄明白。任何建议将不胜感激!我们说我有一张这样的桌子:

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,或者Passed列中的所有值都是0。

我尝试过这样的查询:

CASE
    WHEN MIN(Passed?) = 1
    THEN MIN(PlanID)
    ELSE MAX(PlanID)
    END

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

编辑:抱歉,忘了提一下,如果一个人已经传递了一个planID,那么其余的planID应该读作传递。因为Bobby第一次没有通过这两个计划,所以他必须再次接受。自从他第二次通过以来,他不需要第三次参加。如果有意义的话,一个人必须通过这两个计划才算过去。我已经添加了几行,希望能够传达我更好的想法。我可能也会让自己有点混乱。

5 个答案:

答案 0 :(得分:0)

如果刚刚过去了? = 1

select * from table where Passed? = 1

根据需要返回

答案 1 :(得分:0)

如果我们可能会看到同一个名字的多个通行证而你只想拿起第一个通行证,请使用以下查询:

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

如果只能进行一次传球,您只需选择传球:

select * from table where Passed = 1

答案 2 :(得分:0)

您可以使用exists子查询来检查此planID是否存在较小的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 )

答案 3 :(得分:0)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <tbody id="tblRootCauseBody">
    <tr>
      <th>Public Safety</th>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td></td>
    </tr>
    <tr>
      <th>SSW/MS</th>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td>
        <div class="text-center">
          <label class="checkbox-inline">
            <input type="checkbox" class="chkRootCauseSummary" />
          </label>
        </div>
      </td>
      <td></td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
  </tbody>
</table>

答案 4 :(得分:0)

这个有点棘手,因为我考虑了很少的信息并考虑了以下边缘情况:

  1. 学生可以失败跳过计划(失败计划7和通过计划8)
  2. 学生可以跳过计划(采取计划5而不是计划4,3,2,1) - &gt;
  3. 学生不能通过计划(尝试计划1次,但仍包括在输出中)
  4. 学生可以进入中间点(从计划6开始)
  5. 学生可以前后跳过
  6. 此外,这假设最新作品是“自然顺序”的最后一个(插入记录时,而不是PlanID)。

    以下内容适用于所有情况。

    SELECT
        Name,
        Passed=MAX(Passed),
        PlanID=MAX(PlanID)
    FROM
    (
        SELECT
            Flag=DENSE_RANK() OVER(PARTITION BY Name ORDER BY Name,Passed DESC) ,
            Name,
            Passed,
            PlanID  
        FROM
        (
            SELECT
                Name,   
                PlanID,
                Passed
            FROM
                Table
        )AS X
    )AS Y
    WHERE 
        Flag=1
    GROUP BY 
        Name
    
相关问题