0

列に基づいて一意のレコードを取得するクエリを作成しようとしています。これは、データの単純化されたサンプルです。

version        first            last
a              joe              smith
b              jane             smith
c              biff             mcelroy
a              thad             dussledorf

version(この場合、a、b、および c の 1 つのインスタンス) に基づいて一意のレコードを返すクエリが必要です。これらの返された行については、3 つの列すべてを表す必要があります。したがって、理想的な結果は次のようになります。

version        first            last
a              joe              smith
b              jane             smith
c              biff             mcelroy
4

4 に答える 4

1

データベースがウィンドウ関数をサポートしていると仮定すると、これを行う最善の方法は次のとおりです。

select t.*
from (select t.*, row_number() over (partition by version order by version) as seqnum
      from t
     ) t
where seqnum = 1

これにより、バージョンごとに任意の「最初の」行が選択されます。

于 2012-06-27T13:30:28.380 に答える
0

これにバグ/問題があるかどうかはわかりません:

select distinct version,
 (select top 1 [first] from tableName t1 where t1.version = t.version) as [first],
 (select top 1 [last] from tableName t1 where t1.version = t.version) as [last]
from tableName t

各サブクエリには、ある種の「xxxによる順序」を含めることができます。

2つのサブクエリが常に同じ「トップ」レコードを返すかどうかはわかりません...?

しかし、それは理想的ではありません。レコードIDやタイムスタンプなどを使用することをお勧めします。その場合は、別のソリューションを使用します。

于 2012-06-27T13:16:46.737 に答える
0

複数のバージョンの中でどの一意のバージョンを返す必要があるか気にしない場合は、単純に group by を使用できます。

select version, first_name, last_name from table name group by version;
于 2012-06-27T13:37:36.530 に答える
0

あなたの質問に対する答えは、データベースによって異なります。Oracle (pl/sql) を使用している場合は、ランクオーバー機能を使用できます。

SELECT * FROM (SELECT バージョン、最初、最後 RANK() OVER (PARTITION BY バージョン ORDER BY 最初) RANK FROM SomeTable) WHERE RANK = 1;

このクエリをコピーして貼り付けても機能しない場合があります。したがって、 http: //www.techonthenet.com/oracle/functions/rank.php を読んで、何をする必要があるかを理解してください。

于 2012-06-27T14:59:58.700 に答える