Элегантный способ агрегирования и вычисления процентов в sql?

Вы можете добавить пользовательский javascript или jquery с помощью этого плагина. https://wordpress.org/plugins/custom-javascript-editor/

Когда вы используете jQuery, не забудьте использовать режим jquery noconflict

3
задан Gordon Linoff 20 February 2019 в 19:31
поделиться

3 ответа

Я всегда использую window functions для расчета процентов:

Ссылка: http://www.mysqltutorial.org/mysql-window-functions/

Пример : http://sqlfiddle.com/#!17/66373/6

SELECT
  user,
  product,
  c,
  sum(c) over(partition by usr) sc,
  c / sum(c) over(partition by usr) per
FROM (
  SELECT usr, product, count(*) c
   FROM tablex
   GROUP BY usr, product
) t


CREATE TABLE tablex (
  usr varchar(32),
  product varchar(32)
);

INSERT INTO tablex VALUES ('a', 'x');
INSERT INTO tablex VALUES ('a', 'y');
INSERT INTO tablex VALUES ('a', 'y');
INSERT INTO tablex VALUES ('a', 'y');
INSERT INTO tablex VALUES ('a', 'z');
INSERT INTO tablex VALUES ('a', 'z');
INSERT INTO tablex VALUES ('a', 'z');
INSERT INTO tablex VALUES ('a', 'z');
INSERT INTO tablex VALUES ('a', 'z');

INSERT INTO tablex VALUES ('b', 'x');
INSERT INTO tablex VALUES ('b', 'x');
INSERT INTO tablex VALUES ('b', 'x');
INSERT INTO tablex VALUES ('b', 'y');
INSERT INTO tablex VALUES ('b', 'y');
INSERT INTO tablex VALUES ('b', 'y');
INSERT INTO tablex VALUES ('b', 'y');
INSERT INTO tablex VALUES ('b', 'y');
INSERT INTO tablex VALUES ('b', 'y');
INSERT INTO tablex VALUES ('b', 'z');
INSERT INTO tablex VALUES ('b', 'z');
INSERT INTO tablex VALUES ('b', 'z');
INSERT INTO tablex VALUES ('b', 'z');
INSERT INTO tablex VALUES ('b', 'z');
0
ответ дан lmarqs 20 February 2019 в 19:31
поделиться

Я бы написал так:

select user, product, count(*) as c,
       count(*) * 1.0 / sum(count(*)) over (partition by user) as ratio
from table
group by user, product;
0
ответ дан Gordon Linoff 20 February 2019 в 19:31
поделиться

Вы можете использовать этот код и проверить план выполнения, я уверен, что производительность была улучшена.

 select user, product, CAST(count(*) AS decimal(18,4)) / (select count(*) 
               from table t2 where t2.user = t1.user) 
 from table t1
 group by user, product
0
ответ дан Sepna 20 February 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: