2014-01-29 117 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

相關問題