首页 > 解决方案 > SQL 子查询按列值获取行

问题描述

我有一个这样的 PostgreSQL 表:

CREATE TABLE foo(man_id, subgroup, power, grp)
AS VALUES
    (1, 'Sub_A',  4, 'Group_A'),
    (2, 'Sub_B', -1, 'Group_A'),
    (3, 'Sub_A', -1, 'Group_B'),
    (4, 'Sub_B',  6, 'Group_B'),
    (5, 'Sub_A',  5, 'Group_A'),
    (6, 'Sub_B',  1, 'Group_A'),
    (7, 'Sub_A', -1, 'Group_B'),
    (8, 'Sub_B',  2, 'Group_B'),
    (9, 'Sub_C',  2, 'Group_B');

功率计算如下:

所以 Group_A 中 Sub_A 的幂不等于 Group_B 中 Sub_A 的幂

所以 Group_A 中 Sub_B 的幂不等于 Group_B 中 Sub_B 的幂

我想查询数据库并获取相同名称的所有其他名称的subgroup总数不相等的行。powergrp

推荐的方法是什么?

我可以找到总功率的总和:

SELECT sum(power) AS total_power
FROM   foo
GROUP  BY grp

MySQL 解决方案也将被接受。

标签: mysqlsqlpostgresqlaggregate

解决方案


单程:

SELECT f.*
FROM  (
   SELECT subgroup
   FROM  (
      SELECT subgroup, grp, sum(power) AS total_power
      FROM   foo
      GROUP  BY subgroup, grp
      ) sub
   GROUP  BY 1
   HAVING min(total_power) <> max(total_power)  -- can fail for NULL values;
   ) sg
JOIN foo f USING (subgroup);

在您的示例中,所有行都符合条件,除了最后一个带有“Sub_C”的行。

与您之前的问题密切相关:

类似的解释和考虑。

db<>在这里摆弄


推荐阅读