sql - SSMS - 删除重复的分组值
问题描述
我在 SQL (SSMS) 中有一个表,如下所示:
Group|item
1|desk
1|phone
1|book
2|desk
2|phone
3|desk
3|phone
3|book
4|Desk
4|phone
4|laptop
我想删除该组中的所有项目都存在于另一个组中的任何组。如果有 2 个或更多组都具有完全相同的项目,那么我只想保留该组的一个实例并摆脱其他实例。
在上面的示例表中,我只保留第 1 组和第 4 组,因为第 2 组中的所有项目都已存在于第 1 组中,第 3 组只是第 3 组的副本。
有没有简单的方法来实现这一目标?我目前有一个解决方案,我将上面的表选择到一个临时表中,将该表加入到自己的 group!=group 中,获取正确表中项目的不同计数,计算项目匹配的实例数以及两者是否匹配数字相同,我删除了该组。(因为这会显示该组中的所有项目都存在于左侧的组中)
这个解决方案的问题是,通过将表内部连接到组号不匹配的自身上,我必须创建一个具有 (x^2) - x 行数的表和我的真实表处理有超过 30,000 行,我宁愿不创建包含大约 90 亿行的表。
另请注意,我有数千种不同的物品。
解决方案
我会使用NOT EXISTS
:
select distinct t.group
from table t
where not exists (select 1 from table t1 where t1.group < t.group and t1.item = t.item);
group
是 SQL Server 的保留关键字,因此group
不推荐使用 with 来命名列。
推荐阅读
- json - Google Cloud Vision 示例代码错误 (utf-8)
- .htaccess - https://domain dot com 到 https://www.domain dot com 无需编辑 .htaccess 文件
- php - 将 MySQLi 结果填充到 PHP 索引数组中
- php - 服务器中的 ziparchive() 问题
- django - 是否可以在 Django 中扩展站点范围的模板/引用更高目录中的模板?
- c++ - 特殊情况下的智能指针析构函数
- hazelcast - Hazelcast 节点不加入集群
- python - 如何列出所有关注者及其以下日期?
- powershell - 如果我单击表单上的退出按钮退出脚本?
- php - PHP x1,x2,y1,y2坐标的边界框(左,上,高,宽)?