2014-11-13 3 views
0

Я пытаюсь избавиться от повторяющихся записей из следующего набора результатов:Во избежание дублирования записей на основе нескольких столбцов в PostgresSQL

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, Имя_целевого_объекта, 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, но с другой временной меткой - и мне нужно их сохранить, поэтому я не могу просто запустить максимальную или минимальную дату. Я попытался использовать разные, ранжирование и группу, но ничего не работает, я продолжаю получать повторяющиеся записи. Если я использую макс или мин на дату я получаю только один вход на targetID, Имя_целевого_объекта, 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 поверх оригинала - и я все равно получаю дубликаты. Я попытался запустить отличие от eventTimestamp, но она до сих пор не дает мне то, что я хочу

ответ

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 

Edit: date_trunc ('минут', eventTimestamp) следует сделать трюк

+0

Я пробовал это и продолжаю получать дубликаты. –

+0

. Pls отправил ваш запрос, который вы пробовали. – Robert

+0

. Хорошо, но он находится в своем большом запросе с объединениями, чтобы получить дубликат результирующего набора: –