需要按照不同count的数量(三个 四个或五个+)来展示结果
每个count的数量有对应的其他数值(a,b,c,d)
需要在特定时间段内找出最高的数值(max abcd)
求私!
<select id="queryEventQuantity" resultType="com.jdl.lomir.chint.domain.entity.LomirChintEventInfoQuantity">
SELECT
COUNT(*) allQuantity,
COUNT(case when e.status='CONFIRM' then 1 END ) confirmQuantity,
COUNT(case when e.status='UNTREATED' then 1 END ) untreatedQuantity,
COUNT(case when e.status='INVALID' then 1 END ) invalidQuantity,
<choose>
<when test="status!=null">
COUNT(case when e.status=#{status.name} then 1 END ) eventTypeQuantity,
COUNT(case when e.event_type='COLLISION' and e.status=#{status.name} then 1 END ) collisionQuantity,
COUNT(case when e.event_type='OVERSPEED' and e.status=#{status.name} then 1 END ) overspeedQuantity,
COUNT(case when e.event_type='HUMIDITY_EXCEEDED' and e.status=#{status.name} then 1 END ) humidityQuantity,
COUNT(case when e.event_type='COST' and e.status=#{status.name} then 1 END ) costQuantity,
COUNT(case when e.event_type='DAMAGE' and e.status=#{status.name} then 1 END ) damageQuantity,
COUNT(case when e.event_type='DELAY' and e.status=#{status.name} then 1 END ) delayQuantity
</when>
<otherwise>
COUNT(e.event_type) eventTypeQuantity,
COUNT(case when e.event_type='COLLISION' then 1 END ) collisionQuantity,
COUNT(case when e.event_type='OVERSPEED' then 1 END ) overspeedQuantity,
COUNT(case when e.event_type='HUMIDITY_EXCEEDED' then 1 END ) humidityQuantity,
COUNT(case when e.event_type='COST' then 1 END ) costQuantity,
COUNT(case when e.event_type='DAMAGE' then 1 END ) damageQuantity,
COUNT(case when e.event_type='DELAY' then 1 END ) delayQuantity
</otherwise>
</choose>
FROM lomir_chint_event_info e
</select>
给一些示例会好理解一些,你说的还是抽象的东西。
1、根据类型对数据进行分组group by
2、用case when then 对查询的结果进行分类
3、条件处理
可以将具体的场景和问题描述出来,可以做的
没有具体的场景没法弄,看描述应该是先分组进行计算
大概明白题主的意思,就是搞个嵌套组合SQL语句查询出来最大的count数量然后展现出来
补充:题主,你把你的需求详细描述一下
把需求描述清楚了,应该挺简单的
SELECT COUNT(*) allQuantity, COUNT(case when e.status='CONFIRM' then 1 END ) confirmQuantity, COUNT(case when e.status='UNTREATED' then 1 END ) untreatedQuantity, COUNT(case when e.status='INVALID' then 1 END ) invalidQuantity, COUNT(case when e.status=#{status.name} then 1 END ) eventTypeQuantity, COUNT(case when e.event_type='COLLISION' and e.status=#{status.name} then 1 END ) collisionQuantity, COUNT(case when e.event_type='OVERSPEED' and e.status=#{status.name} then 1 END ) overspeedQuantity, COUNT(case when e.event_type='HUMIDITY_EXCEEDED' and e.status=#{status.name} then 1 END ) humidityQuantity, COUNT(case when e.event_type='COST' and e.status=#{status.name} then 1 END ) costQuantity, COUNT(case when e.event_type='DAMAGE' and e.status=#{status.name} then 1 END ) damageQuantity, COUNT(case when e.event_type='DELAY' and e.status=#{status.name} then 1 END ) delayQuantity COUNT(e.event_type) eventTypeQuantity, COUNT(case when e.event_type='COLLISION' then 1 END ) collisionQuantity, COUNT(case when e.event_type='OVERSPEED' then 1 END ) overspeedQuantity, COUNT(case when e.event_type='HUMIDITY_EXCEEDED' then 1 END ) humidityQuantity, COUNT(case when e.event_type='COST' then 1 END ) costQuantity, COUNT(case when e.event_type='DAMAGE' then 1 END ) damageQuantity, COUNT(case when e.event_type='DELAY' then 1 END ) delayQuantity FROM lomir_chint_event_info e e.is_delete=0 =#{beginTime}]]>我来回答吧。 假设我们有这样一个场景,每个接口执行的时候都会记录下接口编号,接口名称,执行时间。 在一定时间内,接口执行次数小于等于1 对服务器压力是60 , 接口执行次数小于等于3 对服务器压力是80, 接口执行次数小于等于4 对服务器压力是90 。
表语句:
DROP TABLE IF EXISTS `execut_log`;
CREATE TABLE `execut_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`interface_id` bigint(20) DEFAULT NULL COMMENT '接口编号',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '接口名称',
`execut_time` datetime(0) DEFAULT NULL COMMENT '接口执行时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of execut_log
-- ----------------------------
INSERT INTO `execut_log` VALUES (1, 1, '商品上架', '2022-08-01 14:29:04');
INSERT INTO `execut_log` VALUES (2, 2, '下订单', '2022-08-01 14:29:17');
INSERT INTO `execut_log` VALUES (3, 2, '下订单', '2022-08-01 14:30:31');
INSERT INTO `execut_log` VALUES (4, 1, '商品上架', '2022-08-01 14:30:44');
INSERT INTO `execut_log` VALUES (5, 3, '商品同步', '2022-08-01 14:31:27');
INSERT INTO `execut_log` VALUES (6, 2, '下订单', '2022-08-01 14:32:06');
INSERT INTO `execut_log` VALUES (7, 2, '下订单', '2022-08-01 14:32:15');
INSERT INTO `execut_log` VALUES (8, 1, '商品上架', '2022-08-01 14:32:23');
SET FOREIGN_KEY_CHECKS = 1;
要求:
需要按照不同count的数量(三个 四个或五个+)来展示结果
每个count的数量有对应的其他数值(a,b,c,d)
语句:
SELECT
CASE
WHEN num <= 1 THEN 60
WHEN num <= 3 THEN 80
WHEN num <= 4 THEN 90
ELSE 0
END AS level,interface_id,name, num
from
(select interface_id,name, count(*) num from execut_log where execut_time BETWEEN '2022/07/31' and '2022/08/02'
GROUP BY interface_id,name ) b
ORDER BY b.num DESC;
需要在特定时间段内找出最高的数值(max abcd)
特定时间段我是看明白了,最高数值 (max abcd) 不是很明白。 我猜测你想要的是 a b c d 中最大的那一个。
语句如下:
select interface_id,name, MAX(level) from (
SELECT
CASE
WHEN num <= 1 THEN 60
WHEN num <= 3 THEN 80
WHEN num <= 4 THEN 90
ELSE 0
END AS level,interface_id,name, num
from
(select interface_id,name, count(*) num from execut_log where execut_time BETWEEN '2022/07/31' and '2022/08/02'
GROUP BY interface_id,name ) b
ORDER BY b.num DESC
) t GROUP BY interface_id,name ORDER BY LEVEL desc LIMIT 1
如果最后一问不是你想要的,你再描述下,我在追答。
其实有count很难实现
可以用sum 去实现它
例子如下
select xy, sum(case when jw_cljgh=1 then 1 else 0 end) as 留级,sum(case when jw_cljgh=2 then 1 else 0 end) as 复学 from xjgl,bjsjk where xjgl.bh=bjsjk.bh group by xy
私
可以参考下这篇文章:https://blog.csdn.net/qq_34972627/article/details/123051450
这类求值用窗口函数最为实用简单,row_number()
需要按照不同count的数量(三个 四个或五个+) 这块没太明白、有具体的数据吗?
萝asdf答得很详细了
有一堆数据,需要统计
有一些统计好的数据,找出对应的对象,
在特定时间段内,给出最大count值和对象。