mysql统计(1)- 常见的时间范围和时间维度统计
mysql常用的日期和时间格式化选项
1.count()函数
1.1 count(*)
计算符合结果集的行数,包括NULL和非NULL值
SELECT COUNT(*) FROM biz_api_record ar;
1.2 count(column_name)
计算特定列中非NULL的数量
SELECT COUNT(ar.id) as totalRequests FROM biz_api_record ar;
1.3 配合distinct
// 统计请求不成功的状态数量
SELECT COUNT(DISTINCT IF(ar.status!='200', ar.status, NULL)) as nonSuccessStatusCount
FROM biz_api_record ar;
1.4 与其他函数配合示例
// 统计不为空字符串的数量
SELECT count(if(LENGTH(ar.upstream_addr) > 0,ar.upstream_addr,NULL)) as forwardCount
FROM biz_api_record ar;
2.sum()函数
对特定的列求和,如果sum()的列中没有任何值,或者所有值都是NULLl,则结果会返回NULL而不是0,如果列中有一个非NULL值,则会忽略NULL值并返回总和
SELECT sum(ar.count) as forwardCount
FROM biz_api_record ar;
与其他函数配合使用
SELECT ifnull(SUM(IF(ar.status='200', 1, 0)),0) as successCount
FROM biz_api_record ar;
3.avg()
返回列的平均值,返回的数据类型为DOUBLE,会忽略列中的NULL值
-- 计算学生平均分
SELECT AVG(score) FROM students;
4.max()
返回列中的最大值,会忽略NULL值
-- 获得最高分
SELECT MAX(score) FROM students;
5.min()
返回列中的最小值,会忽略NULL值
-- 获得最低分
SELECT MIN(score) FROM students;
6.round()
语法:ROUND(number, decimals)
number: 需要四舍五入的值
decimals(可选):返回结果的小数位数。如果省略,数值将四舍五入到最接近的整数。
-- 四舍五入到整数
SELECT ROUND(12.56); -- 结果: 13
SELECT ROUND(12.46); -- 结果: 12
-- 四舍五入到指定小数位
SELECT ROUND(12.5678, 2); -- 结果: 12.57
SELECT ROUND(12.5634, 2); -- 结果: 12.56
-- 使用负数作为小数位:
SELECT ROUND(1234.5678, -2); -- 结果: 1200
注意事项:
- 当 decimals 参数被省略时,ROUND() 函数将四舍五入到最接近的整数。
- 使用负数作为 **decimals **参数可以将数值四舍五入到最近的10、100、1000等。
- ROUND() 函数返回的结果具有与传递给函数的数值相同的数据类型。
- 如果传递给 ROUND() 的数值是 NULL,那么函数的返回值也是 NULL。
7.if()
语法:IF(condition, value_if_true, value_if_false)
- condition: 要测试的条件。
- value_if_true: 如果条件为真,则返回的值。
- value_if_false: 如果条件为假,则返回的值。
SELECT IF(1>0, 'True', 'False'); -- 结果: 'True'
8.ifnull()
语法:IFNULL(value, value_if_null)
- value: 要检查的值。
- value_if_null: 如果 value 是 NULL,则返回的值。
SELECT IFNULL(NULL, 'Default Value'); -- 结果: 'Default Value'
SELECT IFNULL('Hello', 'Default Value'); -- 结果: 'Hello'
9.混合使用示例
SELECT
ac.id,
ac.api_name,
COUNT(ar.id) as totalRequests,
ifnull(SUM(IF(ar.status='200', 1, 0)),0) as successCount,
ifnull(ROUND(SUM(IF(ar.status='200', 1, 0))/COUNT(ar.id) * 100,2),0.00) as successRate,
COUNT(DISTINCT IF(ar.status!='200', ar.status, NULL)) as nonSuccessStatusCount ,
count(if(LENGTH(ar.upstream_addr) > 0,ar.upstream_addr,NULL)) as forwardCount,
ifnull(SUM(IF(ar.upstream_status='200', 1, 0)),0) as forwardSuccessCount,
ifnull(ROUND(SUM(IF(ar.upstream_status='200', 1, 0))/count(if(LENGTH(ar.upstream_addr) > 0,ar.upstream_addr,NULL)) * 100,2),0.00) as forwardSuccessRate,
IFNULL(ROUND(avg(ar.request_total_time),3),0.000) as avgRequestTime,
IFNULL(ROUND(max(ar.request_total_time),3),0.000) as maxRequestTime,
IFNULL(ROUND(min(ar.request_total_time),3),0.000) as minRequestTime,
FROM biz_api_config ac
left JOIN biz_api_record ar ON ar.api_code = ac.api_code
where ac.del_flag = 0
group by ac.id,ac.api_code
人_生或许就是一具皮囊打包,携带着一颗心的羁旅 – 《皮囊》_