1. ホーム
  2. postgresql

[解決済み] Postgresの場合。1つのカラムだけ区別される

2022-04-26 19:09:47

質問

pgsqlで100万行以上の名前を持つテーブルを持っていますが、重複しているものも多くあります。私は3つのフィールドを選択します。 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"] . 名前フィールドは最も重要で、selectを実行するたびにリスト内でユニークでなければならず、ランダムでなければなりません。

で試してみました。 GROUP BY name に id とメタデータがあることを期待されます。 GROUP BY として、またはaggragate関数で、しかし、私はそれらを何らかの形でフィルタリングされたくありません。

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

どのように解決するのですか?

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グループ内の行の優先順位を決定する追加の式を含んでいます。