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

Postgres SQL GROUP BY depending on a value from another column

我正在尝试查询 return 类似于下面的结果集。 我需要 return 每个名称仅 1 行并且需要 GROUP BY 但只需要在等级列下具有值“8”的名称。下面是另一个查询的结果。因为 Sandra 有一个不同于 8 的值,所以应该省略 Sandra。

例如:- 在下面,我只需要为 John 获取一行。 请指教。谢谢。

    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

将您的 table 汇总到名称上,然后使用 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;

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

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

或者,

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;