如何将一列的多个值计为一组?

Abd*_*ani 6 postgresql aggregate postgresql-9.1 aggregate-filter

我有一个main包含以下行的表:

 id |  name  | rank
----+--------+------
  1 | Ali    | a
  2 | Sami   | b
  3 | Khan   | c
  4 | Kamran | d
  5 | Imran  | e
  6 | Asad   | a
  7 | Nawid  | v
  8 | Jamil  | c
  9 | Usman  | j
Run Code Online (Sandbox Code Playgroud)

我想计算 column 中具有某些值的行rank。例如,我想按如下方式对值进行分组:

  • (a,b,v)应按名称归入一组myvalues
  • (c,d,j)应该按名称出现在另一个组中yourvalues
  • (e)应该通过 name 到达另一个组extravalues

我想要的结果:

myvalues | yourvalues | extravalues
   4     |     4      |      1
Run Code Online (Sandbox Code Playgroud)

myvalues计数为 4,因为它由 (a,b,v) 组成。a 出现 2 次,b 出现 1 次,v 出现 1 次 - 总共 4 次
yourvalues由 (c,d,j) 组成的情况也是如此,这些值的出现总共为 4。
并且最后一组extravalues由 (e) 组成,仅计算 1 行。

Erw*_*ter 4

FILTER在 Postgres 9.4+ 中使用聚合子句:

SELECT count(*) FILTER (WHERE rank = ANY ('{a,b,v}')) AS myvalues
     , count(*) FILTER (WHERE rank = ANY ('{c,d,j}')) AS yourvalues
     , count(*) FILTER (WHERE rank = 'e')             AS extravalues
FROM main;
Run Code Online (Sandbox Code Playgroud)

旧版本的详细信息和替代方案: