1つの列と別の列のいずれかを個別に選択する方法は?


29

1つの列のすべての個別の値を見つけるためにSQLデータベースを照会する必要があり、別の列の任意の値が必要です。たとえば、キーと値の2つの列がある次の表を考えます。

key     value
===     =====
one     test
one     another
one     value
two     goes
two     here
two     also
three   example

個別のキーから任意に選択した1つのサンプル行を取得し、おそらく次の3行を取得したいです。

key     value
===     =====
one     test
two     goes
three   example

SQLでこのようなクエリを作成するにはどうすればよいですか?


2
どのDBMS(Oracle、SQL-Server、DB2、MySQL、Postgres)?
ypercubeᵀᴹ

1
これは独自のシステムです。
WilliamKF

回答:


33

記述が最も簡単なクエリは、MySQL用です(厳密なANSI設定はありません)。非標準の構造を使用します。

SELECT key, value
FROM tableX
GROUP BY key ;

厳密な設定ONLY_FULL_GROUP_BYがデフォルトの最新バージョン(5.7および8.0+)ANY_VALUE()では、5.7で追加された機能を使用できます。

SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;

ウィンドウ関数(Postgres、SQL-Server、Oracle、DB2など)を持つ他のDBMSについては、このように使用できます。利点は、結果内の他の列も選択できることです(keyおよび以外value)。

SELECT key, value
FROM tableX
    ( SELECT key, value,
             ROW_NUMBER() OVER (PARTITION BY key 
                                ORDER BY whatever)     --- ORDER BY NULL
               AS rn                                   --- for example
      FROM tableX
    ) tmp 
WHERE rn = 1 ;

上記の古いバージョンおよびその他のDBMSの場合、ほぼすべての場所で機能する一般的な方法です。1つの欠点は、このアプローチでは他の列を選択できないことです。もう一つは、のようなもの集約関数であるMIN()MAX()(ビット、テキスト、塊のような)一部のDBMSで一部のデータ型では動作しません。

SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;

PostgreSQLには、DISTINCT ON使用できる特別な非標準演算子があります。オプションORDER BYは、すべてのグループからどの行を選択するかを選択するためのものです。

SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;

2
@WilliamKF「任意に選択」で「ランダムに選択」を意味する場合ORDER BY whatever、ypercubeのクエリを関数の呼び出しに置き換えて、結果をランダム化します。
リーリッフェル

1
@LeighRiffelランダムである必要はなく、最初に出会ったものがうまく機能するのと同じくらい簡単です。
WilliamKF

3

MS-SQlサーバーの場合:

;with FinalDataset as
(
    select *,
        row_number() over(partition by key order by value) as rownum
    from YourOriginalTable
)
select
   key,
   value
from FinalDataset 
where rownum = 1

同様に、2番目の結果セットにrownum = 2を設定できます


2

受け入れられた答えに似ていますが、min()またはmax()の代わりにarray_agg()を使用できます

SELECT key, (array_agg(value))[1] AS value
FROM tableX
GROUP BY key ;

オプションで、配列内の値を並べ替えて、最大値または最小値を選択できます。

SELECT key, (array_agg(value) ORDER BY value DESC)[1] AS value
FROM tableX
GROUP BY key ;

(PostgreSQLでチェック)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.