2014-01-29 63 views
0

我试图运行一个自定义的SQL查询的数据集内只选择重复的行,但不包括独特的效果。如何删除唯一行并保留重复项? SQL

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

是有可能写这个查询?

UPDATE: duplicates

正如你可以在下图中,项目(ID)500和505包含在其中重复的部分(窗罩)上看到的,所以我想展示什么是公正的结果包含重复项目的项目(ID)。因此,最终视图不会包含项目501,502,503,504,506.而那些被复制的将只显示包含重复字段的行,即项目500(id)将仅显示行100(范围)和108以及删除101,102和114,这些是唯一的。 如下所示,部分OC01(以红色突出显示)也可显示在其他项目(ID),但项目503不应该被显示,因为OC01是不是该ID内复制。

的数据包含在一个Excel文件,然后由所谓的Tableau商务智能软件,它可以让我写自定义SQL从以不同的方式XLS提取数据操作。

+1

您正在使用哪个数据库管理系统? Postgres的?甲骨文? –

+0

发布您的确切表格架构。您所谈论的表格是多对多表格('project_product')?如果是这样的话*我有一个唯一的标识符列(项目)*没有多大意义。 – peterm

+0

这是一个excel文件,我试图用一个名为tableau的软件来操作。我会张贴一张照片,让你更好地了解我正在努力完成的事情。 – rafacardosoc

回答

2

你可以用窗口/解析函数很容易做到这一点:

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; 
+0

linoff,谢谢你的回复,我用图像编辑了上面的问题,以更好地解释我的目标。任何帮助将不胜感激。 – rafacardosoc

+0

@rafacardosoc。 。 。我相信上面的查询是你想要的。 –

+0

当我你上述执行查询(见下文) SELECT吨。*从 [表Sheet 1 $] T1 其中1 <(SELECT COUNT(*)从 [表Sheet 1 $] T2 其中t2。[ id] = t。[id]和t2。[part] = t。[part] 我收到以下错误:Microsoft JET数据库错误0x80040E14:FROM子句中的语法错误 – rafacardosoc

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) 
+0

派生表中没有必要(内联视图)在你的例子中,它并没有提供所有来自基表的列的重复行 – peterm

+0

stat_novice,谢谢你的回复,我用图像编辑了上面的问题以更好地解释我的目标。非常感谢。 – rafacardosoc

+0

在我的例子中,如果你用你的领域“ID”和产品替换你的领域“部分”项目*** ***应该工作。我更喜欢dnoeth的答案,因为它更简单。 –

1

如果你的DBMS不支持戈登·利诺夫的解决方案中使用的窗聚合函数,你可以这样做:

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 
); 
+0

dnoeth,谢谢你的回复,我用图像编辑了上面的问题,以更好地解释我的目标。任何帮助将不胜感激。 – rafacardosoc

+0

这次它效果很好。非常感谢你dnoeth。 查询需要很长时间才能运行,但现在它很棒。谢谢!! – rafacardosoc

相关问题