Postgresql Попытка рассчитать процент от общего числа, используя over (). Никогда не использовал over (), но я прочитал, что это правильный подход - PullRequest
3 голосов
/ 06 января 2020

Вот моя простая структура таблицы с парой результатов: enter image description here

Возраст варьируется от 18 до 100

Я пытаюсь вычислить процент возрастной диапазон, который имеет хорошую работу, например, 18 - 24, 24-30 и т. д. c. Мне нужно суммировать 'good_jobs', потому что это данные опроса, и многие не ответили, поэтому многие пустые значения.

Я пытаюсь объединить то, что я могу сделать в нескольких запросах, в один:

query1:

select sum(good_job) as "18_24_GoodJobs"
from jf_q2
where
age >= 18 and age <= 24
and
working=1;

результат 61

query2:

select sum(good_job) as "18_24_GoodJobs"
from jf_q2
where
age >= 18 and age <= 100
and
working=1;

результат 2571

с одним запросом, выполняющим что-то вроде этого :

select sum(good_job) as "18to24",
(sum(good_job)/ (select sum(good_job over(partition by good_job))) as Percentage)
from jf_q2
where
age >= 18 and age <= 24
and
working=1;

result = some_fractional number

Я надеюсь на что-то вроде

18_24_GoodJobs| all_with_good_jobs
61 | 16%

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

Спасибо и Счастливого воскресенья

1 Ответ

2 голосов
/ 06 января 2020

Вы можете сделать это с помощью условной агрегации:

select
    sum(good_job) filter(where age between 18 and 24) 18_24_GoodJobs,
    sum(good_job) filter(where age between 18 and 24)
        / sum(good_job) 18_24_GoodJobs_Part
from jf_q2
where working = 1

Это дает вам количество хороших рабочих мест в возрасте 18-24 лет и долю в возрасте 18-24 лет среди хороших рабочих мест (в виде десятичного значения) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...