如何删除唯一行和KEEP重复? SQL

时间:2014-01-29 22:24:42

标签: sql duplicates

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

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

是否可以为此编写查询?

更新: duplicates

正如您在下图所示,项目(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中提取数据。

3 个答案:

答案 0 :(得分:3)

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

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;

答案 1 :(得分:1)

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)

答案 2 :(得分:1)

如果您的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
 );