对非唯一数据进行 SQL 连接 - 窗口化/覆盖/排序依据/不同

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

我已经潜伏了足够长的时间,知道你们会解决这个问题,请原谅菜鸟:

给出一些示例数据:

表工作

职位名称 就业人数 总步数 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

  • b.如果步骤运行时间较长,SDLDATE 可能会更大
  • a.STEPTOTAL 是最高的 b.STEPCOUNT
  • 无需加入后续的 JOBNAME、JOBCOUNT 数据,这些数据随着时间的推移不再唯一

我已经尝试过通过推出 SDLDATE 来进行像上面这样的连接:但是,在某些情况下,JOBNAME、JOBCOUNT 可以在第二天再次使用,而在其他情况下,给定的一组 JOBSTEPS 的 SDLDATE 可能会跨越几天。 所以我要么丢失数据,要么加入太多早期的 JOBS 记录。

sql oracle
1个回答
0
投票

不清楚它是关于什么以及问题是什么,但看起来像是一些作业调度和日志记录(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      */

请参阅此处的小提琴

© www.soinside.com 2019 - 2024. All rights reserved.