Oracle sql - 根据另一个字段在列中查找重复值

时间:2016-06-21 10:48:29

标签: sql oracle

我正在尝试根据另一列的数据从列中选择重复数据。例如,我有一个“IN_PROGRESS”或“COMPLETE”事件表。他们每人都有一个身份证。某些事件具有相同的ID但具有不同的状态。 我试图选择status = in_progress或status = complete的数据,但前提是它们的ID是相同的。

这是我到目前为止所尝试的:

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

但显然它只返回id而不是整行,所以我看不到所有的数据。最终,我打算选择表格中的所有数据,同时根据上述内容筛选出重复数据。

我已经开始研究连接或与重复的表进行比较,但我不确定实现我需要的最佳方法是什么。有人可以帮忙吗?

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
)