2016-11-12 3 views
2

я могу сделать запрос на следующей таблице:Postgres: Группа по статье с заранее определенным набором значений

Table1:

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 

Теперь в приведенном выше сценарии я хочу сгруппировать таблицу1 с помощью моего набора элементов, которые у меня есть в массиве. Пример

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 
+0

Является ли это регулярным массивом PostgreSQl или массивом JSON? – Patrick

ответ

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) 
... 
+0

Erwin: http://stackoverflow.com/questions/41034036/postgresql-sql-view-complex-structure –

0

Вам необходимо обратиться в операторе с набором данных в существующем запросе.

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 

EDIT 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 
+0

Я уже пробовал вышеуказанный запрос. Это не даст результат для source_url, который отсутствует в таблице. Он просто дает количество для source_url, которое доступно в таблице –

+0

, запросил обновленный ответ в моей базе данных ... Он по-прежнему дает тот же результат. Не указывайте результат для URL-адресов, которые имеют 0 вхождения –

+0

@SyedAsadAbbasZaidi, тогда вам нужно сделать СОЮЗ результатов. Потому что у вас есть условие, которое необходимо выполнить, а также хотите, чтобы набор результатов не соответствовал этому условию. У меня есть решение UNION. – ScanQR

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; 
Смежные вопросы