2013-06-12 52 views
0

的補目前,我可以從這樣一個表中獲取不同的條目:Postgres的:獲取鮮明的條目

SELECT DISTINCT ON (abc.entry) abc.* FROM table abc 
    JOIN table1 def ON abc.entry = def.entry 
WHERE def.created >= 'some_date' AND def.position = 1; 

有沒有一種方式來獲得具有重複每個條目的條目(的即補?不同的組過some_date

回答

2

您可以使用having條款來獲取在重複條目列表:

SELECT abc.entry 
FROM table abc JOIN 
    table1 def 
    ON abc.entry = def.entry 
WHERE def.created >= 'some_date' AND def.position = 1 
group by abc.entry 
having count(*) > 1 

要獲得行的名單,我將使用窗口功能:

select t.* 
from (SELECT abc.*, count(*) over (partition by entry) as cnt 
     FROM table abc JOIN 
      table1 def 
      ON abc.entry = def.entry 
     WHERE def.created >= 'some_date' AND def.position = 1 
    ) t 
where cnt > 1; 

編輯:

我看到過的術語的混亂。 DISTINCT在SQL中有非常特殊的含義。而且,DISTINCT ON在Postgres中有一個相當不同的含義。我認爲你必須用子查詢來做到這一點:

select abc.* 
from table abc left outer join 
    (SELECT DISTINCT ON (abc.entry) abc.* FROM table abc 
     JOIN table1 def ON abc.entry = def.entry 
     WHERE def.created >= 'some_date' AND def.position = 1 
    ) f 
    on abc.id = f.id 
where f.id is NULL 

雖然是一個謹慎的詞。您正在使用distinct on而沒有order by子句。數據中返回的特定行是不確定的。您應該在這裏添加order by到您的原始數據和子查詢。

select abc.* 
from table abc left outer join 
    (SELECT abc.entry, max(abc.id) as maxid 
     FROM table abc 
     JOIN table1 def ON abc.entry = def.entry 
     WHERE def.created >= 'some_date' AND def.position = 1 
     group by abc.entry 
    ) f 
    on abc.id = f.maxid 
where f.maxid is NULL 
+0

對不起,這些都不讓我在那裏。第一個查詢返回一個條目列表,我已經從我的初始查詢中獲得。如果更正第二個查詢以在第2行上使用「abc.entry」,它將返回發生重複項的所有行的列表。我真正需要的是補充。如果我有集{{1,A},{1,B},{2,A},{2,B},{3,A},{4,A},...}初始查詢,我可能會得到{{1,A},{2,B},{3,A},{4,A}。如果我可以找到{{1,B},{2,A}}的ID,那麼這些記錄就是我想要刪除的記錄。我不能把它們混在一起。 –

+0

@DarinPeterson。 。 。 'abc'中有'id'列嗎? –

+0

是的,def有一個id列,abc有一個id列以及def.id的外鍵。 「entry」是我在初始查詢中定義的關鍵。 –