2016-06-21 86 views
0

我想根據另一列的數據從列中選擇重複數據。例如,我有一個「IN_PROGRESS」或「COMPLETE」事件表。他們每個人都有一個ID。一些事件具有相同的ID但狀態不同。 我想選擇status = in_progress或status = complete的數據,但前提是它們的id相同。Oracle sql - 根據另一個字段在列中查找重複值

這是我迄今爲止嘗試:

SELECT id, count (*) 
FROM events WHERE status = 'IN_PROGRESS' OR status = 'STARTED' 
GROUP BY id HAVING count (*) > 1; 

但很明顯,它只返回的ID,而不是整個行,所以我不能看到所有的數據。最終,我打算選擇表中的所有數據,同時根據上述過濾出重複項。

我已經開始研究一個聯接或者與一個重複的表進行比較,但是我不確定什麼是實現我所需要的最佳方式。有人可以幫忙嗎?

感謝

+0

除了'status',所有其他字段都有相同的值,如果'id'是相同的? – Cynical

+0

這與MySQL有什麼關係?我正在用SQL標記替換MySQL標記。 –

+0

我不知道它是如何發生的,你有重複。你有一個事件表,所以每個記錄應該代表一個事件。你的活動由ID標識,那麼如何重複?爲什麼ID不是表的主鍵? –

回答

1

你可以用一個JOIN這樣做是爲了通過檢測重複記錄的查詢產生的派生表:

SELECT e1.*, e2.cnt 
FROM events e1 
JOIN (
    SELECT id, count (*) cnt 
    FROM events 
    WHERE status = ('IN_PROGRESS', 'STARTED') 
    GROUP BY id 
    HAVING count (*) > 1 
) e2 ON e1.id = e2.id 

或者您可以使用窗口函數:

SELECT * 
FROM (
    SELECT *, 
     COUNT(CASE WHEN status = ('IN_PROGRESS', 'STARTED') THEN 1 END) 
     OVER (PARTITION BY id) AS cnt 
    FROM events) e 
WHERE e.cnt > 1 
+0

如果'STARTED'或'IN_PROGRESS'多出現一次,這將不起作用。過濾狀態並只是「COUNT(DISTINCT ..)」 – sagi

1

嘗試

SELECT * FROM events e1 
WHERE e1.status IN ('IN_PROGRESS' , 'STARTED') 
    AND EXISTS (
    SELECT 1 FROM events e2 
    WHERE e2.id = e1.id 
    AND e2.status IN ('IN_PROGRESS' , 'STARTED') 
    AND e1.status <> e2.status 
) 
相關問題