Postgres:具有预定义值集的分组依据

时间:2016-11-12 03:55:07

标签: sql arrays postgresql left-join coalesce

我可以对下表进行查询:

表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"]

我想要的上表应该是:

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

3 个答案:

答案 0 :(得分:0)

您需要在现有查询中将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

答案 1 :(得分:0)

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;

答案 2 :(得分:0)

将数组unnest到派生表,左连接到它并使用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成为派生表的表列名。如果需要,您可以更加详细:

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