【问题标题】:Finding start time of the last sequence in mysql在mysql中查找最后一个序列的开始时间
【发布时间】:2021-12-02 00:17:26
【问题描述】:

我有下表,其中状态 0 用于非活动设备,状态 1 用于活动设备。

CREATE TABLE `devices` (
  `id` int NOT NULL AUTO_INCREMENT,
  `state` int unsigned NOT NULL,
  `dt` datetime NOT NULL,
  `name` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
   PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO devices (state,name,dt) VALUES (1,'Alfa','2021-10-12 11:30:00');
INSERT INTO devices (state,name,dt) VALUES (0,'Alfa','2021-10-12 11:40:00');
INSERT INTO devices (state,name,dt) VALUES (1,'Alfa','2021-10-12 11:50:00');
INSERT INTO devices (state,name,dt) VALUES (1,'Alfa','2021-10-12 12:00:00');

INSERT INTO devices (state,name,dt) VALUES (1,'Beta','2021-10-12 11:30:00');
INSERT INTO devices (state,name,dt) VALUES (0,'Beta','2021-10-12 11:40:00');
INSERT INTO devices (state,name,dt) VALUES (0,'Beta','2021-10-12 11:50:00');
INSERT INTO devices (state,name,dt) VALUES (0,'Beta','2021-10-12 12:00:00');

http://sqlfiddle.com/#!9/8ea07de/3

查询的预期结果是:

Name    State   FROM                    TO
Alfa    1       '2021-10-12 11:50:00'   '2021-10-12 12:00:00'
Beta    0       '2021-10-12 11:40:00'   '2021-10-12 12:00:00'

目前我只能获取“名称”、“到”和“状态”列。 是否可以为 MySQL 5.6 找到具有预期结果(“来自”列)的查询?

【问题讨论】:

    标签: mysql sql group-by sequence


    【解决方案1】:

    您可以使用下一个查询:

    SET @state = -1; -- initial value not equal to real values
    SET @dt = '';    -- initial value not equal to real dates
    
    SELECT 
        name,
        state,
        from_dt,
        dt
    FROM (
      -- get last dt by name
      SELECT name, max(dt) dt
      FROM devices
      GROUP BY name
    ) last_state
    JOIN (
      SELECT 
        name,
        state,
        dt,
        -- store dt eachtime when state changes
        @dt := IF(@state <> state, dt, @dt) from_dt,
        @state := state
      FROM devices
      ORDER BY name, dt ASC
    ) first_state using (name, dt)
    ;
    

    MySQL fiddle

    【讨论】:

    • 这不会为 Alfa 提供预期的结果
    • 你说得对。使用旧的 MySQL 版本执行此操作并不复杂。它要求在这里使用变量。我解决了它并更新了答案。
    • 在 MySQL 8.0 中可以通过使用窗口函数的简单查询来解决
    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多