Sql 如何排除最近日期的结果?
我对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
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;