sql >> Databáze >  >> RDS >> Mysql

Potřebujete pole datových bloků z databáze MySql

Podívejte se na níže uvedený diagram, který představuje některá překrývající se časová období

X----|              |--------|         |------X
    |-------X      X------------X
                         |----|     X----|

Začátek nebo konec libovolného souvislého časového období označeného X nespadá do žádného jiného časového období. Pokud tyto časy určíme, můžeme udělat určitý pokrok.

Tento dotaz identifikuje hranice.

SELECT boundary FROM
(

-- find all the lower bounds
    SELECT d1.StartDate AS boundary, 'lower' as type
    FROM dates d1
    LEFT JOIN dates d2 ON ( 
        d1.StartDate > d2.StartDate
        AND 
        d1.StartDate < d2.EndDate
    )
    WHERE d2.RowId IS NULL
    GROUP BY d1.StartDate

UNION

-- find all the upper bounds
    SELECT d1.EndDate AS boundary, 'upper' as type
    FROM dates d1
    LEFT JOIN dates d2 ON ( 
        d1.EndDate > d2.StartDate
        AND 
        d1.EndDate < d2.EndDate 
    )
    WHERE d2.RowId IS NULL
    GROUP BY d1.StartDate
) as boundaries

ORDER BY boundary ASC

Výsledek tohoto dotazu na vaše data je

boundry    | type
------------------
2011-01-01 | lower
2011-02-20 | upper
2011-03-01 | lower
2011-04-01 | upper

Časová období, o která se zajímáte, jsou mezi po sobě jdoucími dolními a horními hranicemi uvedenými výše. S trochou následného zpracování je lze snadno najít.



  1. SQL COUNT() pro začátečníky

  2. Získejte zaměstnance, kteří jsou po zvýšení platu pod průměrem

  3. MySQL SELECT posledních pár dní?

  4. Jaké je číslo MAX, pokud uložím int(255) v MySQL?