2016-06-21 48 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 
) 
相关问题