我对一组可以启动或不启动的软件包的启动时间感兴趣。 我想要第一个启动包的开始时间。所以是最短开始时间,但不是初始开始时间。 为了使事情变得更复杂,有几组包是由 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) 工作。
有效的解决方案:
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";