如何按多列分组并在下面分开:
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。