我正在查看的数据集中包含事件的ID,但有几列(a_dttm,b_dttm和c_dttm)的日期和时间不止一次出现。我调查了一下,发现尽管ID是唯一的,但整个行看起来几乎完全相同。
因此,无需经过200行潜在的相同行,我可以在postgres中编写什么来搜索a_dttm,b_dttm和c_dttm中相同的行?
这就是我一直在逐一选择相同的行:
SELECT *
FROM data
WHERE a_dttm::timestamp = '2007-01-13 08:29:35'
order by a_dttm desc
我从另一个查询中获取了时间戳。
我知道如果这三列完全相同,那么这些行肯定是重复的。
答案 0 :(得分:1)
尝试
select count(*), a_dttm, b_dttm, c_dttm
from data
group by a_ddtm, b_dttm, c_dttm;
这应该告诉你有多少重复。
答案 1 :(得分:0)
这将选择存在(至少一个)其他行的所有行,具有相同的{a_dttm,b_dttm,c_dttm},但具有不同的id:
SELECT *
FROM the_table t
WHERE EXISTS (
SELECT*
FROM the_table x
WHERE x.a_dttm = t.a_dttm -- same
AND x.b_dttm = t.b_dttm --same
AND x.c_dttm = t.x_dttm --same
AND x.id <> t.id -- different
);
类似,但现在实际上正在删除(某些)重复数据:
DELETE
FROM the_table t
WHERE EXISTS (
SELECT*
FROM the_table x
WHERE x.a_dttm = t.a_dttm -- same
AND x.b_dttm = t.b_dttm --same
AND x.c_dttm = t.x_dttm --same
AND x.id > t.id -- different (actually: with a higher id)
);