使用 With 子句的相关 SQL 查询

数学590

我正在尝试修改以下查询:

SELECT START_END.*, START_END.LOAD_TIME_END - START_END.LOAD_TIME_START
FROM
(
  SELECT START.JOB_ID, START.LOAD_TIME_START, END.LOAD_TIME_END
  FROM
  (
    SELECT JOB_ID,LOAD_TIME AS LOAD_TIME_START
    FROM JOB_CTRL_RECON JCR
    INNER JOIN
    (
      SELECT JOB_ID AS JOB_ID_S, MAX(RECON_ID) AS S_MAX_RECON_ID
      FROM job_ctrl_recon
      where job_id in ('1','2')
      and count_type = 'Source'
      GROUP BY JOB_ID
    ) SMAX
    ON JCR.JOB_ID = SMAX.S_MAX_RECON_ID
    AND JCR.RECON_ID = SMAX.RECON_ID
  ) START
  INNER JOIN
  (
    SELECT JOB_ID,LOAD_TIME AS LOAD_TIME_END FROM JOB_CTRL_RECON JCR INNER JOIN 
    (
      SELECT JOB_ID AS JOB_ID_T, MAX(RECON_ID) AS T_MAX_RECON_ID
      FROM job_ctrl_recon
      where job_id in ('1','2')
      and count_type = 'Target'
      GROUP BY JOB_ID
    ) TMAX
    ON JCR.JOB_ID = TMAX.T_MAX_RECON_ID
    AND JCR.RECON_ID = TMAX.RECON_ID
  ) END
  ON START.JOB_ID = END.JOB_ID
) START_END

使用 with 子句进行查询,如下所示:

我怎样才能消除where job_id in ('1','2')使用 with 子句的多次使用,如下所示:

WITH A AS 
(
  SELECT JOB_ID FROM JOB_CTRL_RECON WHERE JOB_ID IN ('60','67')
)
SELECT START_END.*, START_END.LOAD_TIME_END - START_END.LOAD_TIME_START
FROM 
(
  SELECT START.JOB_ID, START.LOAD_TIME_START, END.LOAD_TIME_END
  FROM
  (
    SELECT JOB_ID,LOAD_TIME AS LOAD_TIME_START
    FROM JOB_CTRL_RECON JCR
    INNER JOIN 
    (
      SELECT JOB_ID AS JOB_ID_S, MAX(RECON_ID) AS S_MAX_RECON_ID
      FROM job_ctrl_recon
      where job_id in (????)
      and count_type = 'Source'
      GROUP BY JOB_ID
    ) SMAX
    ON JCR.JOB_ID = SMAX.S_MAX_RECON_ID
    AND JCR.RECON_ID = SMAX.RECON_ID
  ) START
  INNER JOIN 
  (
    SELECT JOB_ID,LOAD_TIME AS LOAD_TIME_END
    FROM JOB_CTRL_RECON JCR
    INNER JOIN 
    (
      SELECT JOB_ID AS JOB_ID_T, MAX(RECON_ID) AS T_MAX_RECON_ID
      FROM job_ctrl_recon
      where job_id in (????)
      and count_type = 'Target'
      GROUP BY JOB_ID
    ) TMAX
    ON JCR.JOB_ID = TMAX.T_MAX_RECON_ID
    AND JCR.RECON_ID = TMAX.RECON_ID
  ) END
  ON START.JOB_ID = END.JOB_ID
) START_END, A
WHERE START_END.JOB_ID = A.JOB_ID
乔恩·海勒

代替WITH,您可以使用KEEP带有分析函数的来简化代码该代码起初有点奇怪,但它只允许您指定一次 JOB_ID,并且只需从表中读取一次。

--Load time start and end for each JOB_ID, based on the latest RECON_ID.
select
    job_id,
    max(load_time_start) load_time_start,
    max(load_time_end) load_time_end,
    max(load_time_end) - max(load_time_start) diff
from
(
    --First and last load time for each set of rows, with some debug data.
    select job_id, count_type, recon_id, load_time
        ,last_value(case when count_type = 'Source' then load_time else null end)
            over (
                partition by job_id, count_type
                order by recon_id
                rows between unbounded preceding and unbounded following
            ) load_time_start
        ,last_value(case when count_type = 'Target' then load_time else null end)
            over (
                partition by job_id, count_type
                order by recon_id
                rows between unbounded preceding and unbounded following
            ) load_time_end
    from job_ctrl_recon
    where job_id in (1,2)
)
group by job_id
order by job_id;

对于此表和数据:

create table job_ctrl_recon(job_id number, recon_id number, count_type varchar2(100), load_time date);

alter session set nls_date_format = 'DD-Mon-RR';

insert into job_ctrl_recon
select 1, 400, 'Source', '24-Feb-18' from dual union all
select 1, 40,  'Source', '23-Feb-18' from dual union all
select 1, 89,  'Target', '25-Feb-18' from dual union all
select 1, 8,   'Target', '25-Feb-18' from dual union all
select 2, 700, 'Source', '24-Feb-18' from dual union all
select 2, 8,   'Source', '23-Feb-18' from dual union all
select 2, 567, 'Target', '25-Feb-18' from dual union all
select 2, 45,  'Target', '25-Feb-18' from dual union all
select 2, 678, 'Target', '25-Feb-18' from dual;

commit;

这些是结果:

JOB_ID   LOAD_TIME_START   LOAD_TIME_END   DIFF
------   ---------------   -------------   ----
1        2018-02-24        2018-02-25      1
2        2018-02-24        2018-02-25      1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在where子句中具有相关子查询的SQL查询

来自分类Dev

SQL查询使用组子句

来自分类Dev

使用 WHERE IN 子句的 SQL 查询

来自分类Dev

使用 SQL 的相关子查询

来自分类Dev

SQL查询:在WHERE子句中使用AND / OR

来自分类Dev

使用参数为IN子句的SQL Server查询

来自分类Dev

使用参数为IN子句的SQL Server查询

来自分类Dev

使用多个where子句的SQL Server查询

来自分类Dev

使用 where 子句透视 sql 查询

来自分类Dev

IN()子句中的SQL查询

来自分类Dev

sql where子句查询

来自分类Dev

OR子句减慢SQL查询

来自分类Dev

带OR子句的SQL查询

来自分类Dev

SQL 查询子句的顺序

来自分类Dev

SQL Server相关查询

来自分类Dev

sql查询相关问题

来自分类Dev

在SQL查询的WHERE子句中使用表的值

来自分类Dev

在WHERE子句SQL查询中的CASE语句之间使用AND

来自分类Dev

SQL查询的HAVING子句只能使用聚合函数吗?

来自分类Dev

使用查询结果确定SQL的where子句中的值?

来自分类Dev

在SQL查询中使用带有Union子句的group / order by

来自分类Dev

使用SQL子查询或JOIN子句进行选择

来自分类Dev

使用WHERE子句中的and或and结构优化SQL查询

来自分类Dev

在SQL查询的'WHERE'子句中的'SELECT'中使用'IF'的结果

来自分类Dev

Pyodbc - 使用 WHERE 子句运行 SQL 查询(语法错误)

来自分类Dev

在 where 子句中使用可变参数查询 SQL

来自分类Dev

使用 WHERE 子句和 CONVERT 或 CAST 的 T-SQL 查询

来自分类Dev

sql在where子句中使用查询别名

来自分类Dev

使用 WHERE IN 子句检查多维数组中的值的 SQL 查询