Создать представление для последнего значения каждый день (без пропущенных дней) - PullRequest
0 голосов
/ 09 октября 2019

У меня есть таблица, в которой записывается версия прошивки для каждого устройства каждый день. Если устройство выйдет из строя, сценарий для заполнения прошивки устройства не сможет найти его по значению, поэтому нет записи для дней офлайн. Мне нужно представление, которое будет возвращать последнюю версию прошивки для каждого устройства каждый день, независимо от того, было ли устройство выключено или нет. Это прекрасно работает в Postgres SQL:

SELECT
    d.ip,
    d.date,
    CASE
        WHEN f.firmware_version IS NOT NULL THEN f.firmware_version
        ELSE (--Use last available firmware_version for the device:
            SELECT l.firmware_version
            FROM firmware l
            WHERE l.date < d.date AND l.firmware_version IS NOT NULL
            ORDER BY l.date DESC
            LIMIT 1)
        END AS firmware_version
FROM
    devices d --Table with a record for every device every day
    LEFT JOIN firmware f ON d.date = f.date AND d.ip = f.ip

Однако мы переходим на Denodo, и я не могу заставить этот запрос работать в Denodo. Кажется, что с ошибкой в ​​подзапросе в заявлении case. Кто-нибудь знает, как я могу получить подобную логику для создания представления в Denodo?

1 Ответ

0 голосов
/ 11 октября 2019

Я понял это! Это немного долго и сложно, но работает так, как я надеялся. Вот решение, если оно кому-нибудь еще поможет:

--Get all values of firmware prior to the listed date
--Note: Will need to find the latest firmware for each date in a later step
WITH firmware_prep (
    ip,
    date_main,
    date_firmware,
    firmware
) AS (
    SELECT
        d.ip,
        d.date,
        f.date,
        f.firmware
    FROM
        device d LEFT JOIN
        firmware f ON (d.ip = f.ip AND f.date <= d.date AND f.firmware IS NOT NULL) 
)

SELECT
    s.ip,
    s.date_main AS date,
    f.firmware
FROM
    (--Here's where you find which firmware date is the latest available date for each listed date:
        SELECT
            ip,
            date_main,
            MAX(date_firmware) AS select_date
        FROM
            firmware_prep
        GROUP BY
            ip,
            date_main
    ) s LEFT JOIN
    firmware f ON s.select_date = f.date AND s.ip = f.ip
...