2013-07-23 23 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