sql - 删除给定条件下的所有行
问题描述
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 中添加要删除的条件。任何帮助深表感谢。
解决方案
您可以使用窗口函数来过滤所需的行:
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 的逻辑。
推荐阅读
- php - 尝试从 Android Studio 发送 PHP 表单
- sql-server - 更新匹配和不匹配的记录?
- r - 求节点 u 和 v 之间通过节点 g 的最短路径总数
- git - Git:如何下载单个文件的整个历史记录?
- c# - 如何提取现有数组中元素的片段以生成新数组
- dart - 类型“int”不是类型转换中“String”类型的子类型
- jboss - 如何将缓存的 Keycloak 数据保存到持久数据存储中?
- java - Jackson -- 使用 xpath 或类似方法解析 json
- spring - 使用 SSL / HTTPS 的 Spring Boot 项目无法在 AWS Elastic Beanstalk 上运行
- python - 跨多行匹配日志条目