认真分析一条复杂的sql以及其相关的流程和函数
首先我拿最近项目中的一数据表,并为之添加出一些相关的数据
CREATE TABLE `dc_equipment_measure_point` (
`id` varchar(64) NOT NULL COMMENT '主键id',
`instant_point` varchar(64) DEFAULT NULL COMMENT '点位',
`instant_data` decimal(18,3) DEFAULT NULL COMMENT '瞬时值/累计值',
`equipment_dec` varchar(128) DEFAULT NULL COMMENT '设备描述',
`equipment_standard_name` varchar(128) DEFAULT NULL COMMENT '设备标准名称',
`branch_factory_name` varchar(128) DEFAULT NULL COMMENT '分厂或者公司名称',
`unit` varchar(24) DEFAULT NULL COMMENT '单位',
`rate` decimal(10,2) DEFAULT NULL COMMENT '采集频率',
`subscribe_to_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '数据订阅时间',
`sort_num` int(8) NOT NULL DEFAULT '1' COMMENT '排序',
`type` int(2) NOT NULL DEFAULT '1' COMMENT '类型 1 一次性水 2 软水 3 煤炭-香碳 4 煤炭-烟炭 5 煤炭-焦炭 6 煤气 7 氧气 8 氮气 9 压缩空气 10 蒸汽消耗 11 电能',
`level` int(1) NOT NULL DEFAULT '1' COMMENT '级别 1,3',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`is_enable` varchar(8) NOT NULL DEFAULT '01' COMMENT '是否启用,01启用,02不启用',
`creator` varchar(64) DEFAULT NULL COMMENT '创建人',
`modifier` varchar(64) DEFAULT NULL COMMENT '修改人',
`created` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
`is_deleted` varchar(8) NOT NULL DEFAULT '01' COMMENT '01正常,02删除',
`point_type` int(1) DEFAULT '1' COMMENT '点位类型 1 瞬时点位 2 累计点位',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_type` (`type`) USING BTREE,
KEY `idx_instant_point` (`instant_point`) USING BTREE,
KEY `idx_enable` (`is_enable`) USING BTREE,
KEY `idx_deleted` (`is_deleted`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='设备数据测量点';
先说一下需求:求当月的对应的产品的总量以及相关的类型?主要产品是有累加值以及有不同的点位信息等,好了,不多巴巴啦,直接上结果。
SELECT
emp.type,
SUM(
CASE
WHEN emp.type <> 11 THEN
emp.instant_data
WHEN emp.type = 11
AND ( emp.instant_point LIKE '%_27' ) THEN
emp.instant_data ELSE 0
END
) AS instantData
FROM
dc_equipment_measure_point emp
INNER JOIN (
SELECT
SUBSTRING_INDEX( GROUP_CONCAT( id ORDER BY created DESC ), ',', 1 ) AS id
FROM
dc_equipment_measure_point
WHERE
point_type = 2
AND is_deleted = '01'
AND is_enable = '01'
AND `level` = 3
AND DATE_FORMAT( created, '%Y-%m' ) = '2021-04'
AND type IN ( 1, 6, 3, 5, 4, 11 )
GROUP BY
type,
instant_point
) t1 ON emp.id = t1.id
GROUP BY
emp.type;
那么我接下来开始分析一下这条sql的实现的细节,以及执行的流程
首先想的是查询出每一种商品每一个节点对象在表中对应的月份出现的最后一条数据
然后我们就根据类型分组来查询所有的商品的对应的节点的所有的数据,注意此时我们要用的主要是对其相关的sum函数进行求和
最后重点来了,需要做对应的case when对应的筛选,可以来实现对应的type=11的时候,主要是其对应的有三种类型,在这些类型中对其相关的功能的需要判断,我们只需要其中电力的内容