#sql #postgresql
#sql #postgresql
Вопрос:
Итак, у меня есть эта таблица:
| model | user_type | count |
------- ------------ -------
| 2017 | member | 42 |
| 2017 | occasional | 562 |
| 2017 | visitor | 156 |
| 2018 | member | 223 |
| 2018 | occasional | 2828 |
| 2018 | visitor | 781 |
| 2019 | member | 185 |
| 2019 | occasional | 2193 |
| 2019 | visitor | 596 |
| 2020 | member | 41 |
| 2020 | occasional | 244 |
| 2020 | visitor | 54 |
и я хотел бы получить эту таблицу:
| model | user_type | count | percentage |
|-------|------------|-------|---------------|
| 2017 | member | 42 | 0.05526315789 |
| 2017 | occasional | 562 | 0.7394736842 |
| 2017 | visitor | 156 | 0.2052631579 |
| 2018 | member | 223 | 0.05819415449 |
| 2018 | occasional | 2828 | 0.7379958246 |
| 2018 | visitor | 781 | 0.2038100209 |
| 2019 | member | 185 | 0.06220578346 |
| 2019 | occasional | 2193 | 0.7373907196 |
| 2019 | visitor | 596 | 0.200403497 |
| 2020 | member | 41 | 0.1209439528 |
| 2020 | occasional | 244 | 0.7197640118 |
| 2020 | visitor | 54 | 0.1592920354 |
Где процент получается путем деления count на сумму count за данный год (процент в первой строке равен: 42/(42 562 156) )
Ответ №1:
Просто используйте оконные функции:
select t.*,
count * 1.0 / sum(count) over (partition by year) as ratio
from t;
Это * 1.0
просто преобразование целого числа в какое-то десятичное число для деления.
Ответ №2:
Вы можете использовать window functions
.
SELECT MODEL,user_type,count,
COUNT/SUM(COUNT) OVER(PARTITION BY MODEL ORDER BY MODEL) AS percentage
FROM K1
Ответ №3:
Вам просто нужно включить подзапрос.
SELECT
model,
user_type,
count,
count / (SELECT SUM(t2.count) FROM user_table t2 WHERE t1.model = t2.model) AS percentage
FROM user_table t1