Расчет процентов из другого столбца sql / presto - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть эта таблица

month_year  shopid  payment_method   count
Jul-19      3lokpn99    CC           115
Jul-19      3lokpn99    PAYPALL      1
Jul-19      6jyhikmm    CC           180
Jul-19      6jyhikmm    PAYPALL      7
Aug-19      3lokpn99    CC           108
Aug-19      3lokpn99    PAYPALL      4
Aug-19      6jyhikmm    CC           114
Aug-19      6jyhikmm    PAYPALL      3

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

month_year  shopid  payment_method   count   %
Jul-19      3lokpn99    CC           115    99.14
Jul-19      3lokpn99    PAYPALL      1      0.86
Jul-19      6jyhikmm    CC           180    96.26
Jul-19      6jyhikmm    PAYPALL      7      3.74
Aug-19      3lokpn99    CC           108    96.43
Aug-19      3lokpn99    PAYPALL      4      3.57
Aug-19      6jyhikmm    CC           114    97.4
Aug-19      6jyhikmm    PAYPALL      3      2.56

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Возможны разные подходы

  • с использованием оконных функций
  • самостоятельное соединение с агрегацией (как представлено в ответе Войцеха)

Подход с использованием оконных функцийимеет дополнительное преимущество в том, что исходные данные читаются только один раз.

SELECT month_year, shopid, payment_method, count,
    100e0 * count / sum(count) OVER (
        PARTITION BY month_year, shopid
        RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
        AS "%"
FROM ...

(протестировано в Presto 318)

См. документацию по функциям окна Presto https://prestosql.io/docs/current/functions/window.html

0 голосов
/ 25 сентября 2019

Вы можете достичь этого результата по запросу:

SELECT s.*, ROUND(s.count / ss.count_summed * 100,2) AS `%`
FROM stack s
JOIN (SELECT s.month_year, s.shopid, SUM(s.count) AS count_summed FROM stack s GROUP BY s.month_year, s.shopid) ss ON ss.month_year = s.month_year AND ss.shopid = s.shopid;
...