编写SQL查询以排除日期早于具有特定标志的记录的记录

编写SQL查询以排除日期早于具有特定标志的记录的记录,sql,Sql,我有一个项目预算修订表,其中包含以下主要字段:project、RevisionId、BookDate和RevisionType。修订类型字段可以是“NT”或“NA”,其中“NT”表示净变动,“NA”表示新金额。当预算修订的修订类型为“NT”时,它是对给定项目预算的净更改。当预算修订的修订类型为“NA”时,它将覆盖给定项目中日期等于或更早的所有预算修订。我正在尝试编写一个SQL查询,该查询提供一个过滤掉所有被“NA”记录覆盖的预算修订记录的结果 例如,未筛选,该表包含以下数据: 我需要查询结果来

我有一个项目预算修订表,其中包含以下主要字段:project、RevisionId、BookDate和RevisionType。修订类型字段可以是“NT”或“NA”,其中“NT”表示净变动,“NA”表示新金额。当预算修订的修订类型为“NT”时,它是对给定项目预算的净更改。当预算修订的修订类型为“NA”时,它将覆盖给定项目中日期等于或更早的所有预算修订。我正在尝试编写一个SQL查询,该查询提供一个过滤掉所有被“NA”记录覆盖的预算修订记录的结果

例如,未筛选,该表包含以下数据:

我需要查询结果来返回以下内容:


如果我没有弄错,您可以使用
不存在
和布尔逻辑:

select t.*
from mytable t
where 
    revisiontype = 'NA'
    or not exists (
        select 1
        from mytable t1
        where t1.project = t.project and t1.bookdate > t.bookdate and t1.revisiontype = 'NA'
    )
如果数据库支持窗口函数,也可以使用窗口函数来表示:

select *
from (
    select t.*,
        max(case when revisiontype = 'NA' then bookdate end) over(partition by project) max_na_date
    from mytable t
) t
where revisiontype = 'NA' or bookdate > max_na_date or max_na_date is null