Postgres:使用预定义值集按子句分组

Postgres: Group by clause with predefined set of values

我可以查询以下 table:

表 1:

id       name           source_url
1        object1        www.google.com
2        object2        www.facebook.com
3        object3        www.twitter.com
4        object5        www.google.com

查询:

select count(*) as counts, source_url from Table1 group by source_url

上面的查询会得到以下结果:

counts    source_url
2         www.google.com
1         www.facebook.com
1         www.twitter.com

现在在上面的场景中,我想要的是根据数组中的元素集对 table1 进行分组。 例子

arr[] = ["www.facebook.com","www.google.com","www.instagram.com","www.yahoo.com","www.abc.com"]

上面table我想要的结果应该是:

counts    source_url
2         www.google.com
1         www.facebook.com
0         www.instagram.com
0         www.yahoo.com
0         www.abc.com

您需要对现有查询中的数据集应用 IN 运算符。

select count(*) as counts, source_url from Table1 WHERE source_url IN ('www.facebook.com','www.google.com','www.instagram.com','www.yahoo.com','www.abc.com') group by source_url

编辑 2: 如果您需要计算那些与您的数据集不匹配的行,那么您可以尝试内置 SQL 函数。我已经提到了其中之一。 根据您的数据库,您可以找到可用的函数。

select COALESCE(count(*), 0) as counts, source_url from Table1 WHERE source_url IN ('www.facebook.com','www.google.com','www.instagram.com','www.yahoo.com','www.abc.com') group by source_url
UNION
select COALESCE(count(*), 0) as counts, source_url from Table1 WHERE source_url NOT IN ('www.facebook.com','www.google.com','www.instagram.com','www.yahoo.com','www.abc.com') group by source_url
select source_url, count(id)
from (
    select * from unnest(arr) as source_url
) as t2
left join lateral (
    select source_url, id from Table1 where source_url = any(arr)
) as t1
using(source_url) group by source_url;

将数组取消嵌套到派生的 table,左连接到它并使用 COALESCE() 将 NULL 替换为 0:

SELECT COALESCE(counts, 0) AS counts, source_url
FROM   unnest('{www.facebook.com,www.google.com,www.instagram.com
               ,www.yahoo.com,www.abc.com}'::text[]) source_url
LEFT  JOIN (
   SELECT count(*) AS counts, source_url
   FROM   Table1
   GROUP  BY source_url
   ) USING (source_url);

source_url 成为派生的 table 的 table 列名称。如果需要,您可以更详细:

...
FROM   unnest(your_array) AS tbl_alias(column_alias)
...