簡體   English   中英

MySQl-AVG(AVG IF)和分組依據

[英]MySQl - AVG ( AVG IF) & group by

我使用MySQL。 我有以下格式的數據-

DATE     , PAGE , PAGE_LOAD_DURATION , VISIT_TYPE
01-01-15 , A    ,                  6 , AM
01-01-15 , B    ,                  4 , PM
01-01-15 , C    ,                  5 , AM
01-01-15 , D    ,                  4 , AM
02-01-15 , B    ,                 13 , PM
03-01-15 , C    ,                 15 , PM
04-01-15 , A    ,                 17 , PM
05-01-15 , A    ,                 34 , PM
06-01-15 , B    ,                 56 , AM
07-01-15 , C    ,                 12 , AM
08-01-15 , D    ,                 89 , AM
09-01-15 , B    ,                 34 , AM
10-01-15 , R    ,                 12 , PM
11-01-15 , T    ,                 56 , AM
12-01-15 , E    ,                 78 , PM
13-01-15 , B    ,                 90 , AM
14-01-15 , A    ,                 34 , PM
15-01-15 , A    ,                 56 , AM
16-01-15 , B    ,                 23 , AM
17-01-15 , A    ,                 15 , PM
18-01-15 , R    ,                 17 , AM
19-01-15 , Y    ,                 37 , PM
20-01-15 , C    ,                 23 , AM

我正在嘗試在給定的日期范圍內生成每種訪問類型的每頁平均頁面加載持續時間

我想以以下格式生成輸出-

PAGE, VISIT_TYPE, AVERAGE_PAGE_LOAD_DUR
A, AM, average_page_load_dur
A, PM, average_page_load_dur
B, AM, average_page_load_dur
B, PM, average_page_load_dur
C, AM, average_page_load_dur
C, PM, average_page_load_dur
D, AM, average_page_load_dur
D, PM, average_page_load_dur
so on

要計算總和而不是平均值,我使用以下查詢-

select
    PAGE,
    SUM(IF(VISIT_TYPE = 'AM',AVERAGE_PAGE_LOAD_DUR,0)) AS SUM_AM,
    SUM(IF(VISIT_TYPE = 'PM',AVERAGE_PAGE_LOAD_DUR,0)) AS SUM_PM
from
        PAGE_VISITS
where
    DATE >= '01-01-15' and DATE <= '09-01-15'
group by
    PAGE

為了計算平均值,我用AVG代替了SUM,但是,這似乎不是正確的方法,因為在掃描每一行時都在計算平均值,這是沒有意義的(我認為這是工作原理。請否則請糾正我)

select
    PAGE,
    AVG(IF(VISIT_TYPE = 'AM',AVERAGE_PAGE_LOAD_DUR,0)) AS SUM_AM,
    AVG(IF(VISIT_TYPE = 'PM',AVERAGE_PAGE_LOAD_DUR,0)) AS SUM_PM
from
        PAGE_VISITS
where
    DATE >= '01-01-15' and DATE <= '09-01-15'
group by
    PAGE

請問如何獲得平均水平?

只需忽略, 0 我更喜歡case ,所以我將其寫為:

select PAGE,
       AVG(CASE WHEN VISIT_TYPE = 'AM' THEN AVERAGE_PAGE_LOAD_DUR END) AS AVG_AM,
       AVG(CASE WHEN VISIT_TYPE = 'PM' THEN AVERAGE_PAGE_LOAD_DUR END) AS AVG_PM,
from PAGE_VISITS
where DATE >= '2015-01-01' and DATE <= '2015-09-01'
group by PAGE;

筆記:

  • AVG()忽略NULL值,但在計算中將包括0
  • 計算為平均值的列可能不應稱為SUM()
  • 使用ISO和MySQL標准日期格式:YYYY-MM-DD

最后,如果您對每頁兩行感到滿意,那么這會更簡單:

select PAGE, AVG(AVERAGE_PAGE_LOAD_DUR) AS AVG_page_load
from PAGE_VISITS
where DATE >= '2015-01-01' and DATE <= '2015-09-01'
group by PAGE, VISIT_TYPE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM