按多列分组并单独

时间:2015-06-22 17:56:36

标签: mysql group-by

如何按多列分组并在下面分开:

SELECT unit_id, status_engine, created_at FROM positions

将导致:

"unit_id","status_engine","created_at"
437,1,"06/20/2015 00:00:09"
437,1,"06/20/2015 00:01:09"
425,1,"06/20/2015 00:01:12"
425,1,"06/20/2015 00:01:17"
437,1,"06/20/2015 00:01:22"
425,1,"06/20/2015 00:01:27"
425,0,"06/20/2015 00:02:51"
437,1,"06/20/2015 00:03:13"
425,0,"06/20/2015 00:03:24"
425,0,"06/20/2015 00:03:30"
425,1,"06/20/2015 00:03:34"
425,1,"06/20/2015 00:05:48"
425,0,"06/20/2015 00:06:00"
425,0,"06/20/2015 00:12:04"    
425,1,"06/20/2015 00:14:00"
425,1,"06/20/2015 00:14:30"    
444,0,"06/20/2015 00:19:45"
425,1,"06/20/2015 00:19:47"
425,1,"06/20/2015 00:20:17"
437,0,"06/20/2015 00:21:01"
437,0,"06/20/2015 00:22:01"

我想将单元ID和状态引擎分组,如果单元ID和状态引擎仍然相同,则不会创建新行。但如果单位ID相同且状态引擎发生变化,则会创建新行。或者如果单位ID不相同,它将创建新行。

基本上,如果Unit ID或Status Engine中的一个发生了变化,它将创建新行。目的是避免使用与之前的数据相同的数据单元ID和状态引擎。

我使用过这个查询:

SELECT   gn,
         unit_id,
         status_engine,
         created_at
    FROM (            SELECT @r :=
                                  @r
                                + (@status_engine != status_engine OR @unit_id != unit_id)
                                AS gn,
                             @status_engine := status_engine AS sn,
                             @unit_id := unit_id AS ui,
                             s.unit_id,
                             s.status_engine,
                             s.created_at,
                             s.id                             
                        FROM (            SELECT @r := 0, @status_engine := 0, @unit_id := 0)
                             vars,
                             positions s
                       WHERE created_at BETWEEN start_date
                                            AND end_date
                    ORDER BY unit_id, created_at) al
GROUP BY gn;

"gn","unit_id","status_engine","created_at"
1,437,1,"06/20/2015 00:00:09"
2,425,1,"06/20/2015 00:01:12"
3,425,0,"06/20/2015 00:02:51"
4,425,1,"06/20/2015 00:03:34"
5,425,0,"06/20/2015 00:06:00"
6,425,1,"06/20/2015 00:14:00"
7,444,0,"06/20/2015 00:19:45"
8,437,0,"06/20/2015 00:21:01"

我使用但处理时间过长:

SELECT * from (SELECT @r := @r + (@status_engine != status_engine) AS gn,
                   @status_engine := status_engine AS sn,
                   s.id,
                   s.unit_id,
                   s.status_engine,
                   s.created_at
              FROM (SELECT @r := 0, @status_engine := 0) vars, positions s
           ORDER BY unit_id, created_at) v GROUP BY gn

我希望将它作为程序存储在MySQL中,并且每隔1分钟使用以下内容调用事件:

CREATE EVENT database.event_event
ON SCHEDULE
EVERY "1" MINUTE
STARTS '2015-06-25 19:08:10'

ON COMPLETION PRESERVE
ENABLE
COMMENT ''
DO
BEGIN
CALL report_event(  DATE_SUB(NOW(),INTERVAL 1 MINUTE) , NOW()  );
END

我创建了用于存储此数据的表事件,并添加了INSERT INTO事件(unit_id,status_engine,created_at),但是表事件中的结果仍然生成了与之前数据相同的数据unit_id和status_engine。

0 个答案:

没有答案