Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL Wybierz zakresy dat pomiędzy seriami danych oddzielonymi wartością NULL

Przyglądałem się twojemu „bardziej złożonemu problemowi” (wciąż pracuję nad odpowiedzią), ale oto rozwiązanie tego problemu. Biorąc pod uwagę, że używasz funkcji okien, zakładam, że używasz MySQL 8, a więc możesz również używać CTE:

WITH cte AS (SELECT DATE(`date_time`) AS `date`,
                    `data`,
                    MAX(`data`) OVER (ORDER BY `date_time` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `data_max`
             FROM `test`),
cte2 AS (SELECT `date`,
                `data`,
                `data_max`,
                CASE WHEN `data` < `data_max` THEN `data` - `data_max` END AS `data_diff`
         FROM cte)
SELECT `data_max`, 
       MIN(CASE WHEN `data_diff` IS NOT NULL THEN date END) AS diff_date_from,
       MAX(CASE WHEN `data_diff` IS NOT NULL THEN date END) AS diff_date_to
FROM cte2
GROUP BY `data_max`
HAVING diff_date_from IS NOT NULL

Wyjście:

data_max    diff_date_from  diff_date_to
4           2017-01-04      2017-01-06
5           2017-01-09      2017-01-11
6           2017-01-13      2017-01-13

Demo na dbfiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć plik XML z zapytań MySQL Data?

  2. Dlaczego separator używany z procedurą składowaną w mysql?

  3. Zaawansowana pomoc do projektowania zapytań SQL (duplikaty w dwóch tabelach, wiele pól, możliwe wykluczenia na podstawie jednego pola)

  4. Podzapytanie MySQL z główną zmienną danych zapytania

  5. PHP i enkapsulacja wierszy MySQL w tablicy JSON