2013-06-04 7 views
64

ために、私は(1以上MIOを有する行を。)名前のpgsqlの上のテーブルを持っているが、私はまた、多くの重複を有します。私は3つのフィールド:id,name,metadataを選択します。のPostgres:異なるが1列のみ

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とメタデータを持っているとか、あるいはaggragateの機能を持っていると思っていましたが、何とかフィルタリングしたいと思っていません。

誰もが多くの列を取得する方法を知っていますが、1つの列で異なるものは何ですか?

答えて

135

。あなたが注文する必要が返される行のどの制御する場合:

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

COL1が注文したとき、最初の行が返されます。

distinct on

DISTINCT ON(式[、...])を選択し、所与の式が等しいと評価された行の各セットの最初の行のみを保持します。 DISTINCT ON式は、ORDER BY(上記参照)と同じ規則を使用して解釈されます。各セットの「最初の行」は、ORDER BYを使用して目的の行が最初に表示されない限り、予測できないことに注意してください。

DISTINCT ON式は、一番左のORDER BY式と一致する必要があります。 ORDER BY句には、通常、各DISTINCT ONグループ内の行の優先順位を決定する追加の式が含まれます。

+0

注文の良いキャッチ。彼らはランダムな注文を望んでいると述べたので私はそれを含めなかったが、とにかく言及することが重要である。 –

+0

はい、注文も重要です、ありがとう。 – NovumCoder

+0

'order by name'は必須ですか?それは 'order by 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値を取得し、マイケルの最大値を求められたので、別のメタデータからid値を取得することを意味します。 –

12

誰もが多くの列をフェッチするが、1つの列にのみ明瞭行う方法を知っていますか?

あなたはthe DISTINCT ON clauseが必要です。

私はあなたを表示するためには何もありませんので、あなたは、サンプルデータまたは完全なクエリを提供していませんでした。

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

これは、予測できない( "ランダム"ではない)一連の行を返します。予測可能にしたい場合は、Clodaldoの回答ごとにORDER BYを追加してください。本当にランダムにしたい場合は、ORDER BY random()にします。これは名前を含む行のいずれかが返され

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

:つのみ(又はN)に異なる列を行うに

関連する問題