Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Select 每天为最新值创建视图(无跳过的天数)_Select_Subquery_Case_Where Clause_Denodo - Fatal编程技术网

Select 每天为最新值创建视图(无跳过的天数)

Select 每天为最新值创建视图(无跳过的天数),select,subquery,case,where-clause,denodo,Select,Subquery,Case,Where Clause,Denodo,我有一个每天记录每个设备固件版本的表。如果设备出现故障,则用于填充设备固件的脚本将无法达到该值,因此没有脱机天数的记录。我需要一个视图,该视图将每天返回每个设备的最新固件版本,无论设备是否已关闭。这在Postgres SQL中非常有效: SELECT d.ip, d.date, CASE WHEN f.firmware_version IS NOT NULL THEN f.firmware_version ELSE (--Use last

我有一个每天记录每个设备固件版本的表。如果设备出现故障,则用于填充设备固件的脚本将无法达到该值,因此没有脱机天数的记录。我需要一个视图,该视图将每天返回每个设备的最新固件版本,无论设备是否已关闭。这在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中创建视图吗?

我想出来了!它有点长,有点复杂,但它的工作方式正是我所希望的。如果对其他人有帮助,以下是解决方案:

--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