【问题标题】:MySQL Percentage per hourMySQL 每小时百分比
【发布时间】:2020-10-29 21:29:09
【问题描述】:

我有一个 MySQL 表如下:

到目前为止,我已经能够获得如下成功百分比:

SELECT endDate AS TIME
        ,count(*) * 100.0 / (
            SELECT count(*)
            FROM test_result
            WHERE endDate BETWEEN FROM_UNIXTIME(1603947600)
                    AND FROM_UNIXTIME(1604006628)
                AND testResult IN (
                    "SUCCESS"
                    ,"FAILURE"
                    )
            ) AS "Percent"
    FROM test_result
    WHERE endDate BETWEEN FROM_UNIXTIME(1603947600)
            AND FROM_UNIXTIME(1604006628)
        AND testResult = "SUCCESS"
    GROUP BY 1
        ,testResult

但我的任务是把它做成一个图表,显示全天(每小时)的百分比变化。

这是我最近一次失败的尝试:

SELECT count(*) AS Count
        ,CONCAT (
            month(endDate)
            ,'-'
            ,day(endDate)
            ,'-'
            ,hour(endDate)
            ) AS hour
        ,testResult
    FROM test_result
    WHERE testResult IN (
            'SUCCESS'
            ,'FAILURE'
            )
    GROUP BY testResult
        ,hour
    ORDER BY hour

有什么提示吗?

【问题讨论】:

  • 函数不能使用索引。

标签: mysql sql datetime pivot average


【解决方案1】:

如果你想要endDate每小时的成功率,那么你可以这样做:

select
    date_format(endDate, '%Y-%m-%d %H:00:00') endHour,
    avg(testResult = 'FAILURE') failure_ratio
from test_result
where testResult in ('SUCCESS', 'FAILURE')
group by endHour
order by endHour

date_format() 表达式将endDate 截断为小时:您可以使用该信息进行聚合。另一方面,avg() 计算testResult 中“失败”的比率:这是01 之间的小数,您可以乘以100 以获得百分比。

【讨论】:

  • 有没有办法将日期保留为日期?我需要它仍然是一个日期。
  • @javydreamercsw: date_format() 返回一个字符串,但 MySQL 很乐意将其视为 datetime,因为它的格式与 MySQL 所期望的一致。如果您真的想要一个日期(时间),那么您可以将其转换回来,例如cast(date_format(endDate, '%Y-%m-%d %H:00:00') as datetime)
【解决方案2】:

改为使用条件聚合:

SELECT endDate as time,
       AVG(CASE WHEN testResult = 'SUCCESS' THEN 100.0 ELSE 0 END)
FROM test_result
WHERE endDate BETWEEN FROM_UNIXTIME(1603947600) AND FROM_UNIXTIME(1604006628) AND
      testResult IN ('SUCCESS', 'FAILURE')
GROUP BY 1

【讨论】:

    猜你喜欢
    • 2012-09-25
    • 2013-03-22
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多