避免在PostgreSQL中基于多个列的重复条目
我正在尝试从以下结果集中删除重复项:避免在PostgreSQL中基于多个列的重复条目,postgresql,duplicates,Postgresql,Duplicates,我正在尝试从以下结果集中删除重复项: ID Name missionID teamID eventTimestamp 25 C 1000415147500265653 1 02-11-2014 14:04 25 C 1000415147500265653 1 02-11-2014 14:04 25 C 1000415147500265653 1 02-11-2014 14:04 25 C 1000415147500265653 1
ID Name missionID teamID eventTimestamp
25 C 1000415147500265653 1 02-11-2014 14:04
25 C 1000415147500265653 1 02-11-2014 14:04
25 C 1000415147500265653 1 02-11-2014 14:04
25 C 1000415147500265653 1 02-11-2014 14:04
25 C 1000415147500265653 2 02-11-2014 14:06
25 C 1000415147500265653 2 02-11-2014 14:06
25 C 1000415147500265653 2 02-11-2014 14:06
25 C 1000415147500265653 2 02-11-2014 14:07
25 C 1000415147500265653 2 02-11-2014 14:07
25 C 1000415147500265653 1 02-11-2014 14:08
25 C 1000415147500265653 1 02-11-2014 14:08
对于targetID、targetName、missionID、teamID和eventTimestamp的每个组合,我只需要一个条目。因此,我希望结果集如下所示,而不是上面所示:
targetID targetName missionID teamID eventTimestamp
25 C 1000415147500265653 1 02-11-2014 14:04
25 C 1000415147500265653 2 02-11-2014 14:06
25 C 1000415147500265653 2 02-11-2014 14:07
25 C 1000415147500265653 1 02-11-2014 14:08
如你所见。可能还有其他条目具有相同的targetID、targetName、missionID、teamID组合,但具有不同的时间戳-我需要保留这些条目,因此我不能只在这上面运行max或min date。我曾尝试使用distinct、ranking和group by,但似乎没有任何效果,我不断收到重复条目。如果我在日期上使用max或min,那么每个targetID、targetName、missionID、teamID只能获得一个条目,而这不是我想要的
我的原始查询仅用于获取重复结果集,如下所示:
select targetID, targetName, missionID, teamID, eventTimestamp from (
select a.characterID, a.targetID, a.targetName, a.missionID, b.teamID as teamID, a.eventTimestamp from events_live a
left join (
select distinct characterID, teamID from events_live where eventName = 'missionStarted' or eventName = 'characterCreated') b on a.characterID = b.characterID
where eventName ='missionObjective' and a.eventTimestamp > '2014-10-31' and a.eventTimestamp < '2014-11-07' and objectiveName = 'Capture' and (targetID ='25' or targetID='26' or targetID ='27' or targetID = '28' or targetID = '29') and b.teamID is not null
order by missionID, targetID, eventTimestamp
)t1
order by missionID, targetID, eventTimestamp
我试着在原始的基础上,通过targetID、targetName、missionID、teamID、eventTimestamp对group进行另一次选择,但仍然得到了重复的结果。我已尝试在eventTimestamp上运行distinct,但它仍然无法满足我的需求
SELECT targetID, targetName, missionID, teamID, date_trunc('minute',eventTimestamp ) AS eventTimestamp
FROM (
SELECT a.characterID, a.targetID, a.targetName, a.missionID, b.teamID as teamID, a.eventTimestamp
FROM events_live a
LEFT JOIN (
SELECT distinct characterID, teamID from events_live
WHERE eventName = 'missionStarted'
OR eventName = 'characterCreated') b
ON a.characterID = b.characterID
WHERE eventName ='missionObjective'
AND a.eventTimestamp > '2014-10-31'
AND a.eventTimestamp < '2014-11-07'
AND objectiveName = 'Capture'
AND (
targetID ='25'
OR targetID='26'
OR targetID ='27'
OR targetID = '28'
OR targetID = '29')
AND b.teamID IS NOT NULL
ORDER BY missionID, targetID, eventTimestamp) t1
GROUP BY targetID, targetName, missionID, teamID, eventTimestamp
ORDER BY missionID, targetID, eventTimestamp
编辑:date_trunc'minute',eventTimestamp应该可以做到这一点Ok,但它是一个包含连接的大型查询,甚至可以获得重复的结果集:更新我的答案,使用上面的查询,您不会得到正确的结果?我仍然会得到重复的结果:-@LeneJungKjær您是对的。博士。说明:当时间戳值存储为8字节整数(当前为默认值)时,可在整个时间范围内获得微秒精度values@LeneJungKjær更新了我的答案