I have a table on pgsql with names (having more than 1 mio. rows), but I have also many duplicates. I select 3 fields: id
, name
, 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 つの列に対してのみ distinct を実行する方法を知っている人はいますか?
ベストアンサー1
1 列 (または n 列) のみに対して distinct を実行するには:
select distinct on (name)
name, col1, col2
from names
これにより、名前を含む行が返されます。返される行を制御する場合は、次のように順序付ける必要があります。
select distinct on (name)
name, col1, col2
from names
order by name, col1
col1 で順序付けされた最初の行を返します。
SELECT DISTINCT ON (式[, ...]) は、指定された式が等しいと評価される各行セットの最初の行のみを保持します。DISTINCT ON 式は、ORDER BY (上記を参照) と同じルールを使用して解釈されます。目的の行が最初に表示されるように ORDER BY を使用しない限り、各セットの「最初の行」は予測できないことに注意してください。
DISTINCT ON 式は、左端の ORDER BY 式と一致する必要があります。ORDER BY 句には通常、各 DISTINCT ON グループ内の行の望ましい優先順位を決定する追加の式が含まれます。