我已经潜伏了足够长的时间,知道你们会解决这个问题,请原谅菜鸟:
给出一些示例数据:
表工作
职位名称 | 就业人数 | 总步数 | STRTD日期 | STRT时间 |
---|---|---|---|---|
MIS_JOB_1 | 23013400 | 15 | 20240429 | 230142 |
MIS_JOB_1 | 23013400 | 15 | 20240903 | 230137 |
工作步骤表
职位名称 | 就业人数 | 计步 | SD日期 | SDL时间 |
---|---|---|---|---|
MIS_JOB_1 | 23013400 | 1 | 20240429 | 230142 |
MIS_JOB_1 | 23013400 | 2 | 20240429 | 230143 |
MIS_JOB_1 | 23013400 | 3 | 20240429 | 230143 |
MIS_JOB_1 | 23013400 | 4 | 20240429 | 230144 |
MIS_JOB_1 | 23013400 | 5 | 20240429 | 230145 |
MIS_JOB_1 | 23013400 | 6 | 20240429 | 230146 |
MIS_JOB_1 | 23013400 | 7 | 20240429 | 230147 |
MIS_JOB_1 | 23013400 | 8 | 20240429 | 230147 |
MIS_JOB_1 | 23013400 | 9 | 20240429 | 230148 |
MIS_JOB_1 | 23013400 | 10 | 20240429 | 230149 |
MIS_JOB_1 | 23013400 | 11 | 20240429 | 230150 |
MIS_JOB_1 | 23013400 | 12 | 20240429 | 230150 |
MIS_JOB_1 | 23013400 | 13 | 20240429 | 230151 |
MIS_JOB_1 | 23013400 | 14 | 20240429 | 230152 |
MIS_JOB_1 | 23013400 | 15 | 20240429 | 230153 |
MIS_JOB_1 | 23013400 | 1 | 20240903 | 230137 |
MIS_JOB_1 | 23013400 | 2 | 20240903 | 230138 |
MIS_JOB_1 | 23013400 | 3 | 20240903 | 230139 |
MIS_JOB_1 | 23013400 | 4 | 20240903 | 230140 |
MIS_JOB_1 | 23013400 | 5 | 20240903 | 230140 |
MIS_JOB_1 | 23013400 | 6 | 20240903 | 230141 |
MIS_JOB_1 | 23013400 | 7 | 20240903 | 230142 |
MIS_JOB_1 | 23013400 | 8 | 20240903 | 230143 |
MIS_JOB_1 | 23013400 | 9 | 20240903 | 230144 |
MIS_JOB_1 | 23013400 | 10 | 20240903 | 230145 |
MIS_JOB_1 | 23013400 | 11 | 20240903 | 230146 |
MIS_JOB_1 | 23013400 | 12 | 20240903 | 230147 |
MIS_JOB_1 | 23013400 | 13 | 20240903 | 230148 |
MIS_JOB_1 | 23013400 | 14 | 20240903 | 230148 |
MIS_JOB_1 | 23013400 | 15 | 20240903 | 230149 |
select
a.JOBNAME,
a.JOBCOUNT,
a.STEPTOTAL,
b.STEPCOUNT,
b.PROGNAME,
b.EXTCMD,
b.SDLDATE,
b.SDLTIME,
a.SDLUNAME,
a.STRTDATE,
a.STRTTIME
from JOBS a inner join JOBSTEPS b on a.JOBNAME = b.JOBNAME and a.JOBCOUNT = b.JOBCOUNT where b.SDLDATE = a.STRTDATE
需要更好的连接,可能涉及 a.STRTDATE、b.SDLDATE、a.STEPTOTAL、b.STEPCOUNT
我已经尝试过通过推出 SDLDATE 来进行像上面这样的连接:但是,在某些情况下,JOBNAME、JOBCOUNT 可以在第二天再次使用,而在其他情况下,给定的一组 JOBSTEPS 的 SDLDATE 可能会跨越几天。 所以我要么丢失数据,要么加入太多早期的 JOBS 记录。
不清楚它是关于什么以及问题是什么,但看起来像是一些作业调度和日志记录(SDL 可能是 StepsDataLog)。
首先盲目猜测您的代码尝试,这应该会记录所有作业数据和作业步骤。
Select j.JOBNAME, j.JOBCOUNT, j.STEPTOTAL,
js.STEPCOUNT, js.SDLDATE, js.SDLTIME,
j.STRTDATE, j.STRTTIME
From jobs j
Left Join jobsteps js ON(js.JOBNAME = j.JOBNAME And js.SDLDATE = j.STRTDATE)
Order By j.JOBNAME, j.STRTDATE, js.STEPCOUNT
/* R e s u l t :
JOBNAME JOBCOUNT STEPTOTAL STEPCOUNT SDLDATE SDLTIME STRTDATE STRTTIME
---------- -------- --------- --------- -------- -------- ---------- ---------
MIS_JOB_1 23013400 15 1 20240429 230142 20240429 230142
MIS_JOB_1 23013400 15 2 20240429 230143 20240429 230142
MIS_JOB_1 23013400 15 3 20240429 230143 20240429 230142
MIS_JOB_1 23013400 15 4 20240429 230144 20240429 230142
MIS_JOB_1 23013400 15 5 20240429 230145 20240429 230142
MIS_JOB_1 23013400 15 6 20240429 230146 20240429 230142
MIS_JOB_1 23013400 15 7 20240429 230147 20240429 230142
MIS_JOB_1 23013400 15 8 20240429 230147 20240429 230142
MIS_JOB_1 23013400 15 9 20240429 230148 20240429 230142
MIS_JOB_1 23013400 15 10 20240429 230149 20240429 230142
MIS_JOB_1 23013400 15 11 20240429 230150 20240429 230142
MIS_JOB_1 23013400 15 12 20240429 230150 20240429 230142
MIS_JOB_1 23013400 15 13 20240429 230151 20240429 230142
MIS_JOB_1 23013400 15 14 20240429 230152 20240429 230142
MIS_JOB_1 23013400 15 15 20240429 230153 20240429 230142
--
MIS_JOB_1 23013400 15 1 20240903 230137 20240903 230137
MIS_JOB_1 23013400 15 2 20240903 230138 20240903 230137
MIS_JOB_1 23013400 15 3 20240903 230139 20240903 230137
MIS_JOB_1 23013400 15 4 20240903 230140 20240903 230137
MIS_JOB_1 23013400 15 5 20240903 230140 20240903 230137
MIS_JOB_1 23013400 15 6 20240903 230141 20240903 230137
MIS_JOB_1 23013400 15 7 20240903 230142 20240903 230137
MIS_JOB_1 23013400 15 8 20240903 230143 20240903 230137
MIS_JOB_1 23013400 15 9 20240903 230144 20240903 230137
MIS_JOB_1 23013400 15 10 20240903 230145 20240903 230137
MIS_JOB_1 23013400 15 11 20240903 230146 20240903 230137
MIS_JOB_1 23013400 15 12 20240903 230147 20240903 230137
MIS_JOB_1 23013400 15 13 20240903 230148 20240903 230137
MIS_JOB_1 23013400 15 14 20240903 230148 20240903 230137
MIS_JOB_1 23013400 15 15 20240903 230149 20240903 230137 */
接下来,可以从数据中提取一些可能有用的信息。处理日期时使用字符串并不是一个好主意。跨越到第二天的问题只会让事情变得更加复杂。下面的代码将您的字符串转换为 DATE 数据类型,以获得记录的第一个作业步骤和最后一个作业步骤之间的正确时间跨度(以秒为单位)。
Select j.JOBCOUNT, j.JOBNAME, j.STEPTOTAL,
To_Char( To_Date(j.STRTDATE || ' ' || j.STRTTIME, 'yyyymmdd hh24miss') ,
'dd.mm.yyyy hh24:mi:ss') "STARTED_AT",
Count(js.STEPCOUNT) "COUNT_STEPS_LOGGED",
To_Char(Min( To_Date(js.SDLDATE || ' ' || js.SDLTIME, 'yyyymmdd hh24miss') ), 'dd.mm.yyyy hh24:mi:ss') "FIRST_STEP_AT",
To_Char(Max( To_Date(js.SDLDATE || ' ' || js.SDLTIME, 'yyyymmdd hh24miss') ), 'dd.mm.yyyy hh24:mi:ss') "LAST_STEP_AT",
ROUND(
( Max( To_Date(js.SDLDATE || ' ' || js.SDLTIME, 'yyyymmdd hh24miss') ) -
Min( To_Date(js.SDLDATE || ' ' || js.SDLTIME, 'yyyymmdd hh24miss') ) )
* ( 24 * 60 * 60 ), 0
) "SECONDS_FIRST_TO_LAST"
From jobs j
Left Join jobsteps js ON(js.JOBNAME = j.JOBNAME And
js.JOBCOUNT = j.JOBCOUNT And
js.SDLDATE = j.STRTDATE)
Group By j.JOBCOUNT, j.JOBNAME, j.STEPTOTAL,
To_Char( To_Date(j.STRTDATE || ' ' || j.STRTTIME, 'yyyymmdd hh24miss') ,
'dd.mm.yyyy hh24:mi:ss')
/* R e s u l t :
JOBCOUNT JOBNAME STEPTOTAL STARTED_AT COUNT_STEPS_LOGGED FIRST_STEP_AT LAST_STEP_AT SECONDS_FIRST_TO_LAST
---------- ---------- --------- ------------------- ------------------ ------------------- ------------------- ---------------------
23013400 MIS_JOB_1 15 29.04.2024 23:01:42 15 29.04.2024 23:01:42 29.04.2024 23:01:53 11
23013400 MIS_JOB_1 15 03.09.2024 23:01:37 15 03.09.2024 23:01:37 03.09.2024 23:01:49 12 */
请参阅此处的小提琴。