如何在 postgresql 中选择特定值的计数而不进行分组?

J M*_*J M 1 postgresql

我有一个视图,它是两个选择的 UNION 的结果。它有类似这样的内容:

id foreignkey
1  a
2  a
3  b
4  c
Run Code Online (Sandbox Code Playgroud)

我希望在视图的定义中添加一列,该列将显示值的计数,但不会聚合它们。像这样的事情:

id foreignkey count
1  a          2
2  a          2
3  b          1
4  c          1
Run Code Online (Sandbox Code Playgroud)

我现有的查询基本上是:

create or replace view x as
select * from a
union
select * from b
Run Code Online (Sandbox Code Playgroud)

我想要计算联合的结果,但我不知道该怎么做。

编辑 - 取得了一些进展,使用普通的表格我可以做到这一点:

SELECT *,
 (select count(id) from mytable where t.data = data)
FROM mytable as t
Run Code Online (Sandbox Code Playgroud)

这个问题之所以出现,是因为该表实际上是两个表的并集。不知道如何在不进行两次联合的情况下做到这一点?

小智 5

您可以使用窗口函数:

create or replace view x 
as
select id, foreignkey, count(*) over (partition by foreignkey) as fk_count
from (
  select id, foreignkey from a
  union
  select id, foreignkey from b
) x;
Run Code Online (Sandbox Code Playgroud)

无关,但是:

UNION 从结果中删除重复项,而 UNION ALL 则不会。如果您知道现在有重复项,那么您应该使用 UNION ALL 因为它更快。