Mysql
 sql >> база данни >  >> RDS >> Mysql

Намалете дневната таблица за състоянието, за да съдържа само промени в състоянието

Помислете за следното:

Схема

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(user_id INT NOT NULL
,status CHAR(3) NOT NULL
,date DATE NOT NULL
,PRIMARY KEY(user_id,date)
);

INSERT INTO my_table VALUES
(1, 'GRE', '2018-09-02'),
(1, 'GRE', '2018-09-03'),
(1, 'PRO', '2018-09-04'),
(1, 'PRO', '2018-09-05'),
(1, 'PRO', '2018-09-06'),
(1, 'GRE', '2018-09-07'),
(1, 'GRE', '2018-09-08'),
(1, 'GRE', '2018-09-09'),
(1, 'GRE', '2018-09-10'),

(2, 'GRE', '2018-09-02'),
(2, 'GRE', '2018-09-03'),
(2, 'PRO', '2018-09-04'),
(2, 'PRO', '2018-09-05'),
(2, 'PRO', '2018-09-06'),
(2, 'GRE', '2018-09-07'),
(2, 'GRE', '2018-09-08'),
(2, 'GRE', '2018-09-09'),
(2, 'GRE', '2018-09-10');

Запитване

WITH t AS (
  SELECT user_id
       , status
       , date
       , DENSE_RANK() OVER (PARTITION BY user_id ORDER BY date) 
       - DENSE_RANK() OVER (PARTITION BY user_id,status ORDER BY DATE) grp
    FROM my_table
    )
SELECT t.user_id
     , t.status
     , MIN(t.date) start
     , MAX(t.date) finish
  FROM t
 GROUP  
    BY user_id
     , status
     , grp
 ORDER  
    BY user_id
     , start;
     

+---------+--------+------------+------------+
| user_id | status | start      | finish     |
+---------+--------+------------+------------+
|       1 | GRE    | 2018-09-02 | 2018-09-03 |
|       1 | PRO    | 2018-09-04 | 2018-09-06 |
|       1 | GRE    | 2018-09-07 | 2018-09-10 |
|       2 | GRE    | 2018-09-02 | 2018-09-03 |
|       2 | PRO    | 2018-09-04 | 2018-09-06 |
|       2 | GRE    | 2018-09-07 | 2018-09-10 |
+---------+--------+------------+------------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:InnoDb:Чакането на семафора е продължило> 600 секунди. Ние умишлено сриваме сървъра

  2. Регистрирайте всяка MySQL заявка във файл, като активирате Общия регистър в MAMP

  3. Как да получите името на супервайзера вместо UserID + INNER JOIN в MYSQL

  4. Изберете стойности, които започват с число

  5. JDBC MySql практики за обединяване на връзки, за да се избегне изчерпаният пул за връзки