避免在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更新了我的答案