Postgres SQL GROUP BY取决于另一列的值

时间:2017-11-30 01:43:13

标签: sql postgresql group-by case having-clause

我正在尝试查询设置结果集,返回如下所示的内容。 我需要每个名称只返回1行,并且需要GROUP BY,但只需要在Grade列下具有值'8'的名称。以下是另一个查询的结果。由于Sandra的值不同于8,因此应省略Sandra。

例如: - 在下面我只需为约翰获得一行。 请指教。谢谢。

    Name      Grade
    =======   =====
    Sandra     8  
    Sandra     8
    Sandra     8
    Sandra     9
    John       8
    John       8
    John       8
    John       8


    Expected Result - 1 row

    Name     Grade
    John      8

3 个答案:

答案 0 :(得分:3)

在名称上聚合表格,然后使用HAVING子句筛选出等级不是8的名称(或您不想要的任何其他值)。

SELECT name, MIN(grade) AS grade
FROM yourTable
GROUP BY name
HAVING SUM(CASE WHEN grade <> 8 THEN 1 ELSE 0 END) = 0;

Demo

<强>更新

如果grade列是文本,并且您希望与字符串'8'而不是数字进行比较,那么您可以使用此HAVING子句:

HAVING SUM(CASE WHEN grade <> '8' THEN 1 ELSE 0 END) = 0;

答案 1 :(得分:0)

如果你想要的名字只有8,你可以这样做:

select name
from t
group by name
having min(grade) = max(grade) and min(grade) = 8;

答案 2 :(得分:0)

或者,

SELECT DISTINCT B.name, B.grade
FROM
(
    SELECT name FROM yourTable GROUP BY name HAVING COUNT(DISTINCT grade) = 1
) Z
INNER JOIN
yourTable B
ON Z.name = B.name
AND B.grade = 8;