psql选择具有非唯一列的所有行

2ledvvac  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(209)

查询应该是查询 item 表和:
过滤掉 active=0 项目
选择 id 以及 groupId 至少还有一个项目 groupId ###示例:

| id  | groupId | active |
| --- | ------- | ------ |
| 1   | 1       | 1      |
| 2   | 2       | 1      |
| 3   | 2       | 0      |
| 4   | 3       | 1      |
| 5   | 3       | 1      |
| 6   | 4       | 1      |

期望输出:

| id  | groupId |
| --- | ------- |
| 4   | 3       |
| 5   | 3       |

解释 groupID 1:无效,因为只有1个成员 groupID 2:无效,因为有两个成员,但有一个不活动 groupID 3:有效 groupID 4:无效,因为只有1个成员
我试过的

SELECT id, groupId
FROM items
WHERE id IN (
    SELECT id 
    FROM items
    WHERE active=1
    GROUP BY groupId
    HAVING COUNT(*) > 1
  );

但我知道 id must appear in the GROUP BY clause or be used in an aggregate function 错误。我知道我可以和 sql_mode 但我宁愿避免这个错误。

nxowjjhe

nxowjjhe1#

转到窗口功能:

select i.*
from (select i.*, count(*) over (partition by groupid) as cnt
      from items i
      where active = 1
     ) i
where cnt > 1
ffvjumwh

ffvjumwh2#

窗口功能是一种方式。
但如果要修复查询,则应该这样做:

select a.id, a.groupId from items a
where active = 1 and groupid in(
    select groupId from item 
    where active = 1
    group by groupId
    having count(distinct id) > 1
)

因为我们正在计算哪个groupid对于同一个groupid有超过1个id

相关问题