процент на основе двух столбцов

#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
  

Link to Fiddle

Ответ №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