首页 > 解决方案 > 删除给定条件下的所有行

问题描述

user_id  date         fieldid  fieldvalue  fromvalue Tovalue action 
1        2020-01-01     1         a         NULL      0        C
2        2020-01-01     1         a         NULL      0        C
2        2020-01-01     1         a         NULL      0        N
2        2020-01-02     1         a         NULL      0        C

目前 cte 查询已返回此值。我正在尝试删除用户给定日期、fieldid、fieldvalue 的 action = c 和 action = N 条目。在这种情况下,必须返回第一行和最后一行。必须删除第 2 行和第 3 行,因为其中有 N 行。

在这种情况下,我不确定如何在自加入或 cte 中添加要删除的条件。任何帮助深表感谢。

标签: sqlsql-server

解决方案


您可以使用窗口函数来过滤所需的行:

select t.*
from (select cte.*,
             sum(case when action = 'N' then 1 else 0 end) over (partition by user_id, date) as n_cnt
      from cte
     ) t
where n_cnt = 0;

您也可以在没有窗口函数的情况下编写它:

select cte.*
from cte
where not exists (select 1
                  from cte cte2
                  where cte2.user_id = cte.user_id and
                        cte2.date = cte.date and
                        cte2.action = 'N'
                 );

但是,这有两个对 CTE 的引用,并且可能具有更差的性能——因为 SQL Server 将为每个引用重复 CTE 的逻辑。


推荐阅读