postgresql Postgres:对两组中的记录进行计数(现有外键或空)

j1dl9f46  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(2)|浏览(137)

我有一个表items和一个表batches。一个批可以有n个通过items.batch_id关联的项。
我想在两组batchedunbatched中编写一个查询项计数:
1.项目WHERE batch_id IS NOT NULL(已分批)
1.项目WHERE batch_id IS NULL(未分批)
结果应如下所示
| 分批的|未分批的|
| - -|- -|
| 一百二十万|100个|
感谢您的帮助!
编辑:我被使用X1 M5 N1 X卡住了,结果证明这是一个错误的工作工具。

p5fdfcr1

p5fdfcr11#

您可以将COUNT与'FILTER(WHERE)一起使用
它被称为条件计数
第一个问题
| 匹配的|不匹配的|
| - -|- -|
| 一个|2个|

SELECT 1

fiddle

tp5buhyn

tp5buhyn2#

count()函数似乎是这里最可能的基本工具。给定一个表达式,它返回该表达式计算为非空的行数。给定参数*,它计算组中的所有行数。
从某种程度上说,这是一个技巧,它可以在同一个结果行中获得批处理和未批处理的计数。至少有三种方法可以做到这一点:

  • 使用子查询:
select
  (select count(batch_id) from items) as batched,
  (select count(*) from items where batch_id is null) as unbatched
-- no FROM

这非常简单。每个子查询都被执行并生成一列结果。因为外部查询中没有给出FROM子句,所以将正好有一个结果行。

  • 使用窗口函数:
select
  count(batch_id) over () as batched,
  (count(*) over () - count(batch_id) over ()) as unbatched
from items
limit 1

这将在每个结果行上计算整个表的batchedunbatched结果,items表的每行一个结果行,但实际上只返回一个结果行。(尽管您肯定想测试一下)postgres实际上并不计算limit子句剔除的所有行的计数。例如,将此选项的性能与前一选项的性能进行比较。

  • 使用count()搭配filter子句,如another answer中所详细说明。

相关问题