【问题标题】:Avoid duplicate entries based on multiple columns in PostgreSQL避免基于 PostgreSQL 中的多个列的重复条目
【发布时间】:2015-01-10 09:30:18
【问题描述】:

我正在尝试从以下结果集中删除重复条目:

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 的每个组合,我只需要 1 个条目。所以我希望结果集看起来像这样而不是上面的:

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 组合,但时间戳不同 - 我需要保留这些条目,因此我不能只在此运行最大或最小日期。我尝试过使用 distinct、ranking 和 group by,但似乎没有任何效果,我不断收到重复的条目。如果我在 date 上使用 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

我已经尝试在原始对象的基础上使用 group by targetID、targetName、missionID、teamID、eventTimestamp 进行另一次选择 - 但我仍然得到重复项。我试过在 eventTimestamp 上运行 distinct,但它仍然没有给我想要的

【问题讨论】:

    标签: postgresql duplicates


    【解决方案1】:

    试试这个:

    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 ) 应该可以解决问题

    【讨论】:

    • 好的,但它本身就是一个带有连接的大型查询,甚至可以得到重复的结果集:
    • 更新我的答案,通过使用上面的查询你没有得到正确的结果?
    • 我仍然得到重复 :-(
    • @LeneJungKjær 你是对的。博士。说:“当时间戳值存储为八字节整数(当前默认值)时,微秒精度可用于整个值范围”
    • @LeneJungKjær 更新了我的答案
    【解决方案2】:
    CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COL1, COL2,...);
    

    这将解决问题。

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 2013-07-03
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 2012-08-24
      • 2013-01-14
      相关资源
      最近更新 更多