HANA-SQL 如何获得排除空值的最小值?

问题描述 投票:0回答:1

我对一组可以启动或不启动的软件包的启动时间感兴趣。 我想要第一个启动包的开始时间。所以是最短开始时间,但不是初始开始时间。 为了使事情变得更复杂,有几组包是由 run_id + step_id 的组合定义的。所以我有一个多次运行的池,每个运行都有多个步骤,每个步骤都有多个包。

lt_pkg_rtimes =    SELECT *,                                -- some more fields
                       MIN("EXEC_STARTTIME") OVER
                         ( PARTITION BY "RUN_ID","STEP_ID" ORDER BY "RUN_ID","STEP_ID"  ) --has to be 2nd minimum
                       AS STEP_TSTMAP_START,
                       FROM :lt_pkgdata          --contains all start times, including initial
                       ORDER BY "RUN_ID",
                         "STEP_ID";

所以,我尝试用我创建的 lt_pkg_min 替换 lt_pkgdata,如下所示。

    --finding second minimum execution start time
    lt_pkg_started = SELECT * FROM :lt_pkgdata AS pkg WHERE pkg.exec_starttime > 0;

    --Only if there is no 2nd minimum per run+step, also include the 1st minimum
    lt_pkg_min = SELECT
                     client,
                     run_id,
                     step_id,
                     CASE
                       WHEN exec_starttime > 0
                       THEN ( SELECT MIN("EXEC_STARTTIME")
                                FROM :lt_pkg_started AS std
                                WHERE std.client = client       -- this where does not work like I need it
                                  AND std.run_id = run_id
                                  AND std.step_id = step_id )
                     ELSE
                       exec_starttime
                     END AS exec_starttime,
                   FROM :lt_pkgdata;

我尝试的结果是使用所有 run_id + step_id 组合的所有包中的第二个最小值。 但我需要每个 run_id + step_id 组合。

此外,我正在 AMDP (SAP HANA SQL) 工作。

sql date hana amdp
1个回答
0
投票

有效的解决方案:

    lt_pkg_started = SELECT *
                       FROM :lt_fil_pkgdata AS pkg
                       WHERE pkg.exec_starttime > 0
                       ORDER BY "RUN_ID","STEP_ID";

    lt_pkg_2ndmin = SELECT *,
                        MIN("EXEC_STARTTIME")
                          OVER ( PARTITION BY "RUN_ID","STEP_ID" ORDER BY "RUN_ID","STEP_ID" )
                          AS exec_starttime2      
                      FROM :lt_pkg_started
                      ORDER BY "RUN_ID", "STEP_ID";


    lt_pkg_min = SELECT
                     pkg.client            AS client ,
                     pkg.run_id            AS run_id,
                     pkg.step_id           AS step_id,
                     ( SELECT  MIN("EXEC_STARTTIME2")
                         FROM :lt_pkg_2ndmin as std
                         WHERE std.run_id = pkg.run_id
                           AND  std.step_id = pkg.step_id  )
                        AS exec_starttime,
                   FROM :lt_sum_pkgdata AS pkg
                   ORDER BY "RUN_ID","STEP_ID";
© www.soinside.com 2019 - 2024. All rights reserved.