Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何排除最近日期的结果?_Sql - Fatal编程技术网

Sql 如何排除最近日期的结果?

Sql 如何排除最近日期的结果?,sql,Sql,我对SQL非常陌生,一直在通过谷歌搜索和实验来学习。我正在尝试获取所有工作站名称、作业流名称以及在工作站和作业流列中都存在重复项的有效起始日期。我目前有以下疑问: SELECT T2.WORKSTATION_NAME,T2.JOB_STREAM_NAME,T2.JOB_STREAM_VALID_FROM FROM (SELECT JOB_STREAM_REFS_V.WORKSTATION_NAME, JOB_STREAM_REFS_V.JOB_ST

我对SQL非常陌生,一直在通过谷歌搜索和实验来学习。我正在尝试获取所有工作站名称、作业流名称以及在工作站和作业流列中都存在重复项的有效起始日期。我目前有以下疑问:

SELECT   T2.WORKSTATION_NAME,T2.JOB_STREAM_NAME,T2.JOB_STREAM_VALID_FROM
FROM     (SELECT  JOB_STREAM_REFS_V.WORKSTATION_NAME,
                 JOB_STREAM_REFS_V.JOB_STREAM_NAME
          FROM     MDL.JOB_STREAM_REFS_V AS JOB_STREAM_REFS_V
          GROUP BY WORKSTATION_NAME,JOB_STREAM_NAME
          HAVING   COUNT(JOB_STREAM_NAME) > 1
          ORDER BY WORKSTATION_NAME,JOB_STREAM_NAME) T1
JOIN MDL.JOB_STREAM_REFS_V T2 ON T1.WORKSTATION_NAME = T2.WORKSTATION_NAME
                             AND T1.JOB_STREAM_NAME = T2.JOB_STREAM_NAME
这将给出我所期望的以下结果:

WORKSTATION_NAME    JOB_STREAM_NAME     JOB_STREAM_VALID_FROM 
-------------------------------------------------------------
STATION1            STREAMA             2015-04-26 
STATION1            STREAMA             2015-04-27 
STATION2            STREAMB             2016-04-05 
STATION2            STREAMB             2016-07-25 
STATION2            STREAMB             2016-09-05 
STATION2            STREAMB             2017-07-25 
STATION2            STREAMC             2016-09-21 
STATION2            STREAMC             2016-10-21 
STATION3            STREAMD             2016-08-08 
STATION3            STREAMD               
STATION3            STREAME             2016-09-04 
STATION3            STREAME              
但是,我希望根据有效起始日期排除每个工作站/作业流的最新条目,并仅返回包含较旧有效起始日期或不包含有效起始日期的结果,以便我只得到以下结果:

WORKSTATION_NAME    JOB_STREAM_NAME     JOB_STREAM_VALID_FROM 
-------------------------------------------------------------
STATION1            STREAMA             2015-04-26 
STATION2            STREAMB             2016-04-05 
STATION2            STREAMB             2016-07-25 
STATION2            STREAMB             2016-09-05 
STATION2            STREAMC             2016-09-21 
STATION3            STREAMD               
STATION3            STREAME              

在这一点上,我完全不知所措,不知道如何处理这个问题。我曾尝试使用MAX获取最新日期,并仅显示比使用WHERE更旧的所有内容,但我无法使其正常工作,我甚至不确定将这些语句放在查询中的何处,而且我有一点点可能会被蒙在鼓里。

使用ANSI标准窗口函数,您可以随心所欲。我想这就是你想要的:

SELECT WORKSTATION_NAME, JOB_STREAM_NAME, JOB_STREAM_VALID_FROM
FROM (SELECT jsr.*,
             COUNT(*) OVER (PARTITION BY jsr.WORKSTATION_NAME, jsr.JOB_STREAM_NAME) as cnt,
             MAX(jr.JOB_STREAM_VALID_FROM) OVER (PARTITION BY jsr.WORKSTATION_NAME, jsr.JOB_STREAM_NAME) as max_JOB_STREAM_VALID_FROM
      FROM MDL.JOB_STREAM_REFS_V jsr
     ) jsr
WHERE cnt > 1 AND JOB_STREAM_VALID_FROM < max_JOB_STREAM_VALID_FROM
ORDER BY WORKSTATION_NAME, JOB_STREAM_NAME

子查询为您提供工作站名称/作业流名称对,其中包含多个条目。在此基础上选择记录。您只需在子查询中选择最长日期,然后在主查询中排除它。这是您的查询,其中添加了作业\u流\u有效\u的比较:

您甚至可以删除having count*>1,因为每个工作站\u name/job\u stream\u name的最后记录都被排除在外。这表明我们可以重新制定任务:为我们提供所有具有较新同级的条目。这很简单:

select *
from mdl.job_stream_refs_v jsr
where exists
(
  select *
  from mdl.job_stream_refs_v newer
  where newer.workstation_name = jsr.workstation_name
    and newer.job_stream_name = jsr.job_stream_name
    and newer.job_stream_valid_from > jsr.job_stream_valid_from
)
order by workstation_name, job_stream_name;

用你正在使用的数据库标记你的问题。这太棒了。非常感谢你,它看起来比我一直使用的数据库简单得多,而且更容易理解!是否也可以返回匹配项,其中job\u stream\u valid\u from为NULL?我不知道您希望如何在查询中应用job\u stream\u valid\u from为NULL,但当然可以将此类条件添加到查询中,例如job\u stream\u valid\u from为NULL或存在的位置。。。。
select *
from mdl.job_stream_refs_v jsr
where exists
(
  select *
  from mdl.job_stream_refs_v newer
  where newer.workstation_name = jsr.workstation_name
    and newer.job_stream_name = jsr.job_stream_name
    and newer.job_stream_valid_from > jsr.job_stream_valid_from
)
order by workstation_name, job_stream_name;