如何删除唯一行并保持重复? SQL

Posted

技术标签:

【中文标题】如何删除唯一行并保持重复? SQL【英文标题】:How to remove unique rows and KEEP duplicates? SQL 【发布时间】:2014-01-29 22:24:41 【问题描述】:

我正在尝试运行自定义 sql 查询以仅选择数据集中的重复行,不包括唯一结果。

我试图只显示每个项目的重复行,即,如果对于一个项目(汽车),用户添加了两次产品(窗口)。虽然窗口可能包含在许多其他项目(房屋、建筑物等)中,但条件是项目内的重复,而不是整个数据集。

是否可以为此编写查询?

更新:

如下图所示,项目 (id) 500 和 505 中包含重复的部分(窗口和引擎盖),所以我想显示的只是包含重复项的项目 (id) 的结果。所以最终视图不会有项目 501、502、503、504、506。而那些重复的只会显示包含重复字段的行,即项目 500(id)只会显示第 100 行(范围)和108,并删除唯一的101、102和114。 如下图所示,部分 OC01(以红色突出显示)也可以显示在其他项目(id)上,但不应显示项目 503,因为 OC01 在该 id 中没有重复。

数据包含在一个 excel 文件中,然后由一个名为 Tableau 的 BI 软件进行操作,该软件让我可以编写自定义 sql 来以不同的方式从 xls 中提取数据。

【问题讨论】:

您使用的是哪个 DBMS?后格雷斯?甲骨文? 发布您的确切表架构。你说的表是多对多表(project_product)吗?如果是这样,那么我有一个唯一标识符列(项目)没有多大意义。 这是一个 excel 文件,我正在尝试使用名为 tableau 的软件对其进行操作。我将发布一张图片,让您更好地了解我想要完成的工作。 【参考方案1】:

您可以使用窗口/分析函数轻松完成此操作:

select t.*
from (select t.*, count(*) over (partition by project, product) as cnt
      from table t
     ) t
where cnt > 1;

大多数数据库都支持这些函数。如果它们不可用,您可以使用相关子查询或加入 group by 查询来执行逻辑。

编辑:

我不知道 Tableau 是否支持上述查询。你可以试试这个:

select t.*
from table t1
where 1 < (select count(*)
           from table t2
           where t2.project = t.project and t2.product = t.product
          );

也许这个版本可以工作:

select t.*
from table t join
     (select project, product, count(*) as cnt
      from table t
      group by project, product
     ) pp
     on t.project = pp.project and t.product = pp.product and cnt > 1;

【讨论】:

linoff,感谢您的回复,我用图片编辑了上面的问题,以更好地解释我的目标。任何帮助将不胜感激。 @rafacardosoc 。 . .我相信上面的查询可以满足您的要求。 当我执行上面提到的查询时(见下文) SELECT t.* from [Sheet1$] t1 where 1 【参考方案2】:
SELECT * FROM TABLE1 
WHERE project 
IN (SELECT X.project FROM (
    SELECT project, product,COUNT(product)
    FROM TABLE1
    GROUP BY project,product
    HAVING COUNT(product) > 1)X)
AND product IN (SELECT X.product FROM (
    SELECT project, product,COUNT(product)
    FROM TABLE1
    GROUP BY project,product
    HAVING COUNT(product) > 1)X)

【讨论】:

您的示例中不需要派生表(内联视图)。并且它不会为重复的行提供基表中的所有列。 stat_novice,感谢您的回复,我用图片编辑了上面的问题,以更好地解释我的目标。任何帮助将不胜感激。 在我的示例中,如果您将 project 替换为您的字段“ID”,并将 product 替换为您的字段“part”,它应该起作用。我更喜欢 dnoeth 的答案,因为它更简单。 代码在我上面发布的示例表中运行良好,但是,当我对真实数据(超过 40k 行)使用相同的 sn-p 时,我不会获得相同的结果。 ..【参考方案3】:

如果您的 DBMS 不支持 Gordon Linoff 的解决方案使用的窗口聚合函数,您可以这样做:

select t1.*
from table t1
join
  (select project, product
   from table
   group by project, product
   having count(*) > 1
  ) t2
on t1.project = t2.project
and t1.product = t2.Product;

根据更新的查询进行编辑:

SELECT *
FROM tab t1
WHERE EXISTS
 (
   SELECT * FROM tab t2
   WHERE t1.id = t2.id
     AND t1.part = t2.part
     AND t1.scope <> t2.scope
 );

【讨论】:

dnoeth,谢谢您的回复,我用图片编辑了上面的问题,以更好地解释我的目标。任何帮助将不胜感激。 这次效果很好。非常感谢你。查询需要很长时间才能运行,但现在它很棒。谢谢!!

以上是关于如何删除唯一行并保持重复? SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何仅保留数据字段的最高值行并删除其他行[重复]

如何根据一列是不是具有特定值来查找重复行并删除输出?

如何使用 where/have 子句选择唯一行并与另一个表进行比较

基于两个字段的某些字段选择行并删除重复项并限制为前十名?

如何删除重复条目?

从 BigQuery 中删除重复记录