2013-06-04 32 views
64

我有一個pgsql名稱(有超過1 mio。行)的表,但我也有很多重複。我選擇3個字段:id,name,metadataPostgres:獨特,但只有一列

我想隨機選擇它們ORDER BY RANDOM()LIMIT 1000,所以我這樣做是爲了在我的PHP腳本中保存一些內存很多步驟。

但我怎麼做,所以它只給了我一個名單中沒有重複的名單。

例如[1,"Michael Fox","2003-03-03,34,M,4545"]將被退回,但不是[2,"Michael Fox","1989-02-23,M,5633"]。名稱字段是最重要的,並且每次執行選擇時都必須在列表中唯一,並且它必須是隨機的。

我試過GROUP BY name,然後它期望我在GROUP BY中也有id和元數據,或者在一個集合函數中,但我不想讓它們以某種方式過濾。

任何人都知道如何獲取許多列,但只做一列不同的?

回答

135

要執行一個不同的僅在一個(或n)列(多個):

select distinct on (name) 
    name, col1, col2 
from names 

這將返回任何包含名稱的行的。如果你想控制該行會退還您需要訂購:當COL1下令

select distinct on (name) 
    name, col1, col2 
from names 
order by name, col1 

將返回的第一行。

distinct on

SELECT DISTINCT ON(表達式[,...])只保留每一組,其中所述給定表達式的計算結果等於行中的第一行。 DISTINCT ON表達式使用與ORDER BY相同的規則進行解釋(請參見上文)。請注意,除非使用ORDER BY來確保所需的行首先出現,否則每個集合的「第一行」是不可預知的。

DISTINCT ON表達式必須匹配最左邊的ORDER BY表達式。 ORDER BY子句通常包含額外的表達式,這些表達式決定了每個DISTINCT ON組內行的期望優先級。

+0

良好的訂購。我沒有包括它,因爲他們提到想要隨機排序,但無論如何要提及這一點很重要。 –

+0

是的,順序也很重要,謝謝。 – NovumCoder

+0

是否需要按名稱命令?它會產生一個不同的結果,按col1排序? –

2
SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA 
from SOMETABLE 
GROUP BY NAME 
+2

只是一個警告的話:這可能不會返回屬於「一起」的ID值或元數據值 –

+0

嗯所以這意味着SQL不正確? – NovumCoder

+0

@Novum號。它意味着它從邁克爾的行中獲取一個id值,並從另一個元數據獲取邁克爾的最大值。 –

12

任何人知道如何獲取多列,但僅做了不同的上一列?

你想要the DISTINCT ON clause

您沒有提供示例數據或完整的查詢,所以我沒有任何東西可以顯示給您。你想寫這樣的東西:

SELECT DISTINCT ON (name) fields, id, name, metadata FROM the_table; 

這將返回一個不可預知的(但不是「隨機」)行集合。如果你想讓它可以預測,請按照Clodaldo的回答添加ORDER BY。如果你想使它真正隨機,你會想要ORDER BY random()