MySQl - AVG ( AVG IF) & 分组依据

标签 mysql sql

我使用 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

要计算 SUM 而不是平均值,我使用以下查询 -

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

关于MySQl - AVG ( AVG IF) & 分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37052672/

相关文章:

sql - 如何使用 REGEXP_REPLACE 检查字符串中是否存在值 'Closed' 并替换

SQL:如果另一列不匹配,如何排除最大值

SQL:在三级树中保留 root_id?

Docker 容器内的 MySQL 服务无法在 macOS Sierra 10.12.6 中运行

mysql - 列出过去 12 个月内未订购的 Magento 客户

php - Sql - 仅在列的第一个空单元格中插入值

mysql - 现在()与 GetDate()

sql - 将 "now"行添加到持续时间计算

mysql - 如何保证MySQL复制准确?

mysql问题node js可以插入