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

SQL Join tabulky na Čas mezi začátkem a koncem

Je to trochu neohrabané, ale přišel jsem na toto:

SELECT
    *
FROM
    (
        SELECT
            a.ID AS EventID,
            b.ID AS VideoID,
            b.Filename,
            (
                CASE
                    WHEN a.Time < b.StartTime THEN UNIX_TIMESTAMP(b.StartTime) - UNIX_TIMESTAMP(a.Time)
                    WHEN a.Time > b.EndTime THEN UNIX_TIMESTAMP(a.Time) - UNIX_TIMESTAMP(b.EndTime)
                END
            ) AS distance_factor
        FROM
            `Events` a
        CROSS JOIN
            video b
        WHERE
            NOT EXISTS
            (
                SELECT NULL
                FROM Video
                WHERE a.Time BETWEEN StartTime AND EndTime
            )
    ) c
WHERE 
    c.distance_factor = 
    (
        SELECT
            MIN(CASE WHEN d.Time < e.StartTime THEN UNIX_TIMESTAMP(e.StartTime) - UNIX_TIMESTAMP(d.Time) WHEN d.Time > e.EndTime THEN UNIX_TIMESTAMP(d.Time) - UNIX_TIMESTAMP(e.EndTime) END)
        FROM
            `Events` d
        CROSS JOIN
            video e
        WHERE d.ID = c.EventID
    )
GROUP BY
    c.EventID

Vrátí události, jejichž data nespadají do žádného z časových rozsahů žádného videa, ale pak vrátí video, které je nejblíže k datu události.

Jediné, co teď je, je, že existují videa, kde je rozdíl v sekundách úplně stejný. Nevím, jestli chcete, aby vrátil 2 řádky, ale prozatím jsem vložil GROUP BY, abych vybral jen jeden.

Dejte mi vědět, jak to funguje.



  1. V$SQL_SHARED_CURSOR TOP_LEVEL_RPI_CURSOR

  2. Automatická oprava plánu v SQL Server

  3. Další zpracování dat vrácených v daném dbms_output

  4. Jak se zbavit prázdného, ​​ale obrovského sloupce LOB?