2013-07-23 2 views
0

У меня есть таблица с колонками: date, category, views.Относительная частота по категориям SQL-запросы

Я хотел бы написать запрос, который дает мне следующий вывод:

year, quarter, category, "relative percentage of category views by quarter"

Например:

2013, Q1, blue, 0.15 
2013, Q1, yellow, 0.05 
2013, Q1, green, 0.80 
2013, Q2, blue, 0.20 
2013, Q2, yellow, 0.05 
2013, Q2, green, 0.75 
2013, Q3, blue, 0.10 
2013, Q3, yellow, 0.15 
2013, Q3, green, 0.65 

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

Это просто слишком много состояний для динамического управления только SQL (я использую MySQL)?

Это то, что у меня есть до сих пор.

Это почти то, что я хочу, за исключением того, что относительная частота выводит сумму в 1 по всем кварталам.

SET @total_views = SELECT sum(views) FROM daily_views_by_category; 

SELECT 
    year(dt), 
    quarter(dt), 
    category, 
    sum(views)/@total_views AS category_views 
FROM 
    daily_views_by_category 
GROUP BY 
    year(dt), quarter(dt), category 
ORDER BY 
    year(dt), quarter(dt), category 
; 

ответ

1

Вы хотите сделать это с join, а не переменной. Идея заключается в том, чтобы суммировать данные по годам четверти каталога, а также год на четверть, а затем присоединиться результаты вместе, чтобы сделать арифметику:

SELECT yqc.yr, yqc.qt, category, 
     (yqc.views/yq.views) as category_views 
FROM (select year(dt) as yr, quarter(dt) as qt, category, sum(views) as views 
     from daily_views_by_category vbc 
     group by year(dt), quarter(dt), category 
    ) yqc join 
    (select year(dt) as yr, quarter(dt) as qt, sum(views) as views 
     from daily_views_by_category vbc 
     group by year(dt), quarter(dt) 
    ) yq 
    on yqc.yr = yq.yr and yqc.qt = yq.qt 
ORDER BY 1, 2, 3; 
0

чехол для использования агрегатных функций. Начиная с MySQL 8.0.2, движок поддерживает функции агрегата/окна, но я его не тестировал.

SELECT year(dt) 
     ,quarter(dt) 
     ,category 
     ,SUM(views) 
     ,SUM(views)*1.0/SUM(SUM(views)) OVER (PARTITION BY year(dt), quarter(dt)) 
    FROM daily_views_by_category 
GROUP BY 
     year(dt) 
     ,quarter(dt) 
     ,category 
Смежные вопросы