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

我正在开发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,
 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);
我想要什么?

上述结果不正确,如at
2020-11-01T00:02:17Z所示,
s_类型
WAPDA
和at
2020-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