我正在尝试根据另一列的数据从列中选择重复数据。例如,我有一个“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而不是整行,所以我看不到所有的数据。最终,我打算选择表格中的所有数据,同时根据上述内容筛选出重复数据。
我已经开始研究连接或与重复的表进行比较,但我不确定实现我需要的最佳方法是什么。有人可以帮忙吗?
由于
答案 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
)