认真分析一条复杂的sql以及其相关的流程和函数

认真分析一条复杂的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的时候,主要是其对应的有三种类型,在这些类型中对其相关的功能的需要判断,我们只需要其中电力的内容
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值