Выберите процент другого столбца в postgresql - PullRequest
1 голос
/ 03 апреля 2020

Я хотел бы выбрать, сгруппированных по семейству, количество записей, у которых значение livingofftheland равно true, и вернуть его как значение за c.

По существу столбец 3, деленный на столбец 2, умноженный на 100.

select 

    avclassfamily, 
    count(distinct(malware_id)) as cc, 
    sum(case when livingofftheland = 'true' then 1 else 0 end),  
    (100.0 *  (sum(case when livingofftheland = 'true' then 1 else 0 end)  / (count(*)) ) )  as perc 
from malwarehashesandstrings 
group by avclassfamily  having count(*) > 5000  
order by perc desc;

Вероятно, довольно просто, но мои мозги вычеркивают здесь пробел.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Я бы express это как:

select avclassfamily, 
       count(distinct malware_id) as cc, 
       count(*) filter (where livingofftheland = 'true'),
       ( count(*) filter (where livingofftheland = 'true') * 100.0 /
         count(distinct malware_id)
       ) as perc
from malwarehashesandstrings 
group by avclassfamily 
having count(*) > 5000  
order by perc desc;

Обратите внимание, что это заменяет условное агрегирование на filter, стандартную конструкцию SQL, которую поддерживает Postgres. Он также помещает 100.0 прямо рядом с /, просто чтобы быть уверенным, что Postgres не решит сделать целочисленное деление.

1 голос
/ 03 апреля 2020

выберите, сгруппированные по avfamily, количество записей с livingofftheland значением, равным true, и верните его как значение за c.

Вы можете просто используйте avg() для этого:

select 
    avclassfamily, 
    count(distinct(malware_id)) as cc, 
    avg(livingofftheland::int) * 100 as perc 
from malwarehashesandstrings 
group by avclassfamily
having count(*) > 5000
order by perc desc

livingofftheland::int превращает логическое значение в 0 (false) или 1 (true). Среднее значение этого значения дает отношение записей, которые удовлетворяют условию в группе, в виде десятичного числа между 0 и 1, которое затем можно умножить на 100.

...