Как рассчитать процент по количеству значений столбцов - PullRequest
2 голосов
/ 06 мая 2019

Приведенная таблица выглядит следующим образом.

+----+-------+-----+
| id | class | tag |
+----+-------+-----+
|  1 |     1 | aaa |
|  2 |     1 | abb |
|  3 |     1 | acc |
|  4 |     1 | baa |
|  5 |     2 | bbb |
|  6 |     2 | aaa |
+----+-------+-----+

Как рассчитать количество тегов, начинающихся с a в пределах одного и того же класса для каждого класса в таблице? Результат приведенной выше таблицы будет:

+-------+---------+
| class | percent |
+-------+---------+
|     1 |  0.7500 |
|     2 |  0.5000 |
+-------+---------+

PS: у меня уже было решение, но таблица большая (несколько миллионов строк), не могли бы вы оптимизировать это?

SELECT class, (CAST(cnt_1 AS DECIMAL) / cnt_2) AS percent 
FROM (
  SELECT class, count(tag) AS cnt_1 FROM (
    SELECT class, tag FROM t_test 
    WHERE tag LIKE 'a%'
  ) AS tmp1 
  GROUP BY class
) AS tmp2 
NATURAL JOIN (
  SELECT class, count(tag) AS cnt_2 
  FROM t_test GROUP BY class
) AS tmp3;

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Я бы использовал условное агрегирование:

select class, avg( tag like 'a%' ) as a_ratio
from t_test
group by class;

Проценты обычно идут от 0 до 100. ratio - лучшее название для вашего столбца.

Здесь это db <> скрипка, иллюстрирующая, что это работает.

0 голосов
/ 06 мая 2019

Обновление: Случайно, очень похоже на ответ Гордона. Я просто добавляю правку, чтобы «проценты» выглядели как проценты

select class, round((avg(tag like 'a%')*100),2) percent
from t_test
group by class; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...