【问题标题】:MySQL select data on the basis of source typeMySQL根据源类型选择数据
【发布时间】:2021-02-25 20:23:32
【问题描述】:

我正在处理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');

SQL Fiddle 也是如此

我做了什么

我能够执行名为WAPDA 的源的开始和结束日期时间,并且在那个时候我已经携带了MAXkwh_t 值。我想在 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);

上面的查询给了我

msn          | MAX(kwh_t)| MIN(data_date_time)   | MAX(data_date_time) 
=======================================================================
4A60193390662| 2068.3    | 2020-11-01T00:02:17Z  | 2020-11-01T00:31:44Z

我想要什么?

上述结果不正确,如 Fiddle 2020-11-01T00:02:17Z s_typeWAPDA2020-11-01T00:12:59Z s_typeGenerator。然后又是2020-11-01T00:23:42Z s_type 又是WAPDA 等等。我想设置我的查询,使其根据s_type 提供正确的信息,如下所示

对于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=Generator

如何实现?

任何帮助将不胜感激

【问题讨论】:

    标签: mysql datetime select


    【解决方案1】:

    这是一个空白和孤岛问题。为了解决您的问题,您还需要根据s_type 值对读数进行分组,以便(在您的示例数据中)提取两组不同的WAPDA 值(由Generator 值分隔)。基本上,您需要为每个岛保留一个总行号以及一个行号(因此每当s_type 更改时重新开始计数)。从前者中减去后者可以为每个岛屿提供一个常数,然后您可以在其上进行分组。

    由于缺少ROW_NUMBER 函数,这是在 MySQL 5.x 中解决的一个棘手问题,但是可以使用变量来模拟该功能。这个查询应该给出你想要的结果:

    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
    

    演示(还显示s_type = 'Generator' 的结果)on dbfiddle

    【讨论】:

    • @FaisalQayyum 这回答了你的问题吗?如果没有,您能否提供更多信息来帮助回答?否则,请考虑将答案标记为已接受(上/下投票箭头下的复选标记)。见What should I do when someone answers my question?How does accepting an answer work?
    • 是的,它确实有效。我不在城里所以没有检查它。我还想做一个改变,但有一天我会发布另一个问题。感谢您的帮助:)
    • @FaisalQayyum 很高兴听到。已经有一段时间了,所以我想检查一下并确保它有用。我会留意你的下一个问题 - 希望我能再次提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-05-31
    • 2011-08-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多