MySQL根据源类型选择数据
我正在开发MySQL。我有一张桌子,里面有一些记录。下面是我的桌子MySQL根据源类型选择数据,mysql,datetime,select,Mysql,Datetime,Select,我正在开发MySQL。我有一张桌子,里面有一些记录。下面是我的桌子 CREATE TABLE `mdc_meters_data` ( `id` int(11) NOT NULL AUTO_INCREMENT, `msn` varchar(100) DEFAULT NULL, `kwh_t` varchar(100) DEFAULT NULL, `data_date_time` datetime DEFAULT NULL, `s_type` varchar(100) DEFAULT NULL
CREATE TABLE `mdc_meters_data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`msn` varchar(100) DEFAULT NULL,
`kwh_t` varchar(100) DEFAULT NULL,
`data_date_time` datetime DEFAULT NULL,
`s_type` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=52702 DEFAULT CHARSET=latin1;
/*Data for the table `mdc_meters_data` */
insert into `mdc_meters_data`(`id`,`msn`,`kwh_t`,`data_date_time`,`s_type`) values(49641,'4A60193390662','2068.3','2020-11-01 00:02:17','WAPDA'),
(49642,'00209701','1476.59','2020-11-01 00:02:47','Sync Meter'),(49643,'00209702','1389.79','2020-11-01 00:03:17','Sync Meter'),(49644,'4A60193390662','2068.3','2020-11-01 00:04:57','WAPDA'),(49645,'00209701','1476.6','2020-11-01 00:05:28','Sync Meter'),(49646,'00209702','1389.81','2020-11-01 00:05:58','Sync Meter'),(49647,'4A60193390662','2068.3','2020-11-01 00:07:38','WAPDA'),(49648,'00209701','1476.6','2020-11-01 00:08:08','Sync Meter'),(49649,'00209702','1389.81','2020-11-01 00:08:38','Sync Meter'),(49650,'4A60193390662','2068.3','2020-11-01 00:10:19','WAPDA'),(49651,'00209701','1476.6','2020-11-01 00:10:49','Sync Meter'),(49652,'00209702','1389.82','2020-11-01 00:11:19','Sync Meter'),(49653,'4A60193390662','2068.3','2020-11-01 00:12:59','Generator'),(49654,'00209701','1476.61','2020-11-01 00:13:30','Sync Meter'),(49655,'00209702','1389.83','2020-11-01 00:14:00','Sync Meter'),(49656,'4A60193390662','2068.3','2020-11-01 00:15:40','Generator'),(49657,'00209701','1476.61','2020-11-01 00:16:10','Sync Meter'),(49658,'00209702','1389.84','2020-11-01 00:16:40','Sync Meter'),(49659,'4A60193390662','2068.3','2020-11-01 00:18:20','Generator'),(49660,'00209701','1476.61','2020-11-01 00:18:51','Sync Meter'),(49661,'00209702','1389.84','2020-11-01 00:19:21','Sync Meter'),(49662,'4A60193390662','2068.3','2020-11-01 00:21:01','Generator'),(49663,'00209701','1476.61','2020-11-01 00:21:31','Sync Meter'),(49664,'00209702','1389.85','2020-11-01 00:22:01','Sync Meter'),(49665,'4A60193390662','2068.3','2020-11-01 00:23:42','WAPDA'),(49666,'00209701','1476.62','2020-11-01 00:24:12','Sync Meter'),(49667,'00209702','1389.86','2020-11-01 00:24:42','Sync Meter'),(49668,'4A60193390662','2068.3','2020-11-01 00:26:22','WAPDA'),(49669,'00209701','1476.63','2020-11-01 00:26:53','Sync Meter'),(49670,'00209702','1389.88','2020-11-01 00:27:23','Sync Meter'),(49671,'4A60193390662','2068.3','2020-11-01 00:29:03','WAPDA'),(49672,'00209701','1476.63','2020-11-01 00:29:33','Sync Meter'),(49673,'00209702','1389.88','2020-11-01 00:30:03','Sync Meter'),(49674,'4A60193390662','2068.3','2020-11-01 00:31:44','WAPDA');
同样的情况也在发生
我所做的
我能够执行名为WAPDA
的源的开始和结束日期时间,在这段时间内,我执行了kwh\u t
的MAX
值。我想在24小时内每小时检查一次。因此,我以这种方式管理查询
SELECT
msn,
MAX(kwh_t),
MIN(data_date_time),
MAX(data_date_time)
FROM mdc_meters_data
WHERE s_type = 'WAPDA'
AND data_date_time >= DATE '2020-11-01'
AND data_date_time < DATE '2020-11-02'
GROUP BY msn, DATE(data_date_time), HOUR(data_date_time)
ORDER BY msn, DATE(data_date_time), HOUR(data_date_time);
我想要什么?
上述结果不正确,如at2020-11-01T00:02:17Z所示,s_类型
为WAPDA
和at2020-11-01T00:12:59Z
s_类型
为发电机
。然后在2020-11-01T00:23:42Z
时,s_类型
再次是WAPDA
,依此类推。我想将我的查询设置为根据下面的s\u类型提供适当信息的方式
对于WAPDA
msn | MAX(kwh_t)| MIN(data_date_time) | MAX(data_date_time)
=======================================================================
4A60193390662| 2068.3 | 2020-11-01T00:02:17Z | 2020-11-01T00:10:19Z
4A60193390662| 2068.3 | 2020-11-01T00:23:42Z | 2020-11-01T00:31:44Z
对于生成器
msn | MAX(kwh_t)| MIN(data_date_time) | MAX(data_date_time)
=======================================================================
4A60193390663| 1000.3 | 2020-11-01T00:12:59Z | 2020-11-01T00:21:01Z
由于在2020-11-01T00:10:19Z
之后和2020-11-01T00:22:01Z
之前没有s_type=WAPDA的记录,因此查询必须从记录开始的特定s_type
的值开始。同样适用于s_type=发电机
如何实现
任何帮助都将不胜感激这是一个缺口和孤岛问题。为了解决您的问题,您还需要根据s_类型
值对读数进行分组,以便(在示例数据中)提取两组不同的WAPDA
值(由生成器
值分隔)。基本上,您需要为每个孤岛保留一个总的行号和行号(因此每当s_type
更改时,计数就会重新开始)。从前者中减去后者可以得到每个岛的一个常量,然后可以对其进行分组
在MySQL 5.x中,这是一个需要解决的棘手问题,因为缺少ROW\u NUMBER
函数,但是可以使用变量模拟该功能。此查询应提供所需的结果:
SELECT msn,
s_type,
MAX(kwh_t) AS max_kwh,
MIN(data_date_time) AS min_date_time,
MAX(data_date_time) AS max_date_time
FROM (
SELECT md.*,
@rn := @rn + 1 AS rn,
@rst := CASE
WHEN @st = s_type THEN @rst + 1
WHEN @st := s_type THEN 1
ELSE 1
END AS rst
FROM (
SELECT *
FROM mdc_meters_data
WHERE s_type != 'Sync Meter'
AND data_date_time >= '2020-11-01'
AND data_date_time < '2020-11-02'
ORDER BY data_date_time
) md
CROSS JOIN (SELECT @rn := 0, @rst := 0, @st := '') init
) m
WHERE s_type = 'WAPDA'
GROUP BY msn, rn - rst, DATE(data_date_time), HOUR(data_date_time)
ORDER BY msn, min_date_time
演示(同时显示s_type='Generator'
)的结果。@FaisalQayyum这是否回答了您的问题?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑标记接受的答案(在上/下投票箭头下的复选标记)。看,是的,它确实起了作用。我不在城里,所以没有检查。我还想做一个改变,但总有一天我会发布另一个问题。谢谢你的帮助:)@FaisalQayyum很高兴听到你的话。这已经有一段时间了,所以我想检查一下,确保它是有用的。我会留意你的下一个问题——希望我能再次提供帮助。
SELECT msn,
s_type,
MAX(kwh_t) AS max_kwh,
MIN(data_date_time) AS min_date_time,
MAX(data_date_time) AS max_date_time
FROM (
SELECT md.*,
@rn := @rn + 1 AS rn,
@rst := CASE
WHEN @st = s_type THEN @rst + 1
WHEN @st := s_type THEN 1
ELSE 1
END AS rst
FROM (
SELECT *
FROM mdc_meters_data
WHERE s_type != 'Sync Meter'
AND data_date_time >= '2020-11-01'
AND data_date_time < '2020-11-02'
ORDER BY data_date_time
) md
CROSS JOIN (SELECT @rn := 0, @rst := 0, @st := '') init
) m
WHERE s_type = 'WAPDA'
GROUP BY msn, rn - rst, DATE(data_date_time), HOUR(data_date_time)
ORDER BY msn, min_date_time
msn s_type max_kwh min_date_time max_date_time
4A60193390662 WAPDA 2068.3 2020-11-01 00:02:17 2020-11-01 00:10:19
4A60193390662 WAPDA 2068.3 2020-11-01 00:23:42 2020-11-01 00:31:44