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;
更新:
如果 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;
我正在尝试查询 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;
更新:
如果 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;