159

pgsql に名前 (1 mio. 行以上) を持つテーブルがありますが、多くの重複もあります。idname、 の3 つのフィールドを選択しますmetadata

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ましたが、id とメタデータがGROUP BY同様にまたは集計関数にあることが期待されますが、それらを何らかの形でフィルタリングしたくありません。

多くの列を取得する方法を知っている人はいますが、1 つの列だけを区別しますか?

4

4 に答える 4

293

1 つ (または n) 列のみを個別に実行するには:

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

これにより、名前を含むすべての行が返されます。どの行が返されるかを制御したい場合は、次の順序にする必要があります。

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

col1 で並べ替えた場合、最初の行が返されます。

distinct on:

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

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

于 2013-06-04T12:36:01.350 に答える
21

多くの列を取得する方法を知っている人はいますが、1 つの列だけを区別しますか?

DISTINCT ON必要です。

サンプル データまたは完全なクエリが提供されていないため、表示するものはありません。あなたは次のようなものを書きたい:

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

これにより、予測不可能な (ただし「ランダム」ではない) 行のセットが返されます。予測可能にしたい場合は、ORDER BYClodaldoの回答ごとに追加してください。本当にランダムにしたい場合は、ORDER BY random().

于 2013-06-04T12:35:13.433 に答える