Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgres SQL根据另一列的值进行分组_Sql_Postgresql_Group By_Case_Having Clause - Fatal编程技术网

Postgres SQL根据另一列的值进行分组

Postgres SQL根据另一列的值进行分组,sql,postgresql,group-by,case,having-clause,Sql,Postgresql,Group By,Case,Having Clause,我试图查询返回如下内容的集合结果集。 我只需要为每个名称返回1行,并需要按分组,但只需要在Grade列下具有值“8”的名称。下面是另一个查询的结果。由于Sandra的值不同于8,因此应忽略Sandra 下面我只需要给约翰弄一排。 请告知。多谢各位 Name Grade ======= ===== Sandra 8 Sandra 8 Sandra 8 Sandra 9 John 8

我试图查询返回如下内容的集合结果集。 我只需要为每个名称返回1行,并需要按分组,但只需要在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

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


如果希望名称只有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;

你能给我们看看你想要的产量吗?不清楚您向我们展示的是输入还是输出。Name Grade John 8刚刚编辑并添加到代码部分谢谢您Gordon,8只是虚拟数据,min和max函数不能用于我的实际数据。@StackoverflowUser。打扰一下只能回答你实际提出的问题。如果你还有问题,你应该把它当作另一个问题来问。为什么不能在列上使用
min()
max()
?这些功能几乎没有限制。谢谢Tim!我需要按名称分组,并过滤掉可能有行的任何其他值不是8的名称。8是唯一的伪数据。@StackoverflowUser我更新了我的答案。你最初的问题我不太清楚。我会尝试一下并更新结果,谢谢Tim@StackoverflowUser是的,逻辑是可行的。您只需要更改为检查字符串文字而不是数字。现在让我更新一下。使用了演示,谢谢Tim!
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;