27

人、母国語、およびその他の列 C3 .. C10のテーブルAが...で表されているとします。

表 A

人の言語...
ボブ英語
ジョン・イングリッシュ
ヴラド・ロシア
オルガ ロシア
ホセスペイン語

異なる言語ごとに 1 つの行のすべての列を選択するクエリを作成するにはどうすればよいですか?

望ましい結果

人の言語...
ボブ英語
ヴラド・ロシア
ホセスペイン語

それぞれの異なる言語のどの行が結果になるかは、私にとっては問題ではありません。上記の結果では、各言語の行番号が最も小さいものを選択しました。

4

6 に答える 6

47

Eric Petroelje はほぼ正しいと言えます。

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )

注: ROWNUM (結果セット内の行番号を与える) ではなく、ROWID (行の一意の ID) を使用します。

于 2009-06-11T20:35:44.563 に答える
13

これはより効率的で、さらに値を選択するために使用する順序を制御できます。

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language
               ORDER BY person)
      ,language
FROM   tableA;

各言語で誰が選ばれるかが本当に気にならない場合は、ORDER BY 句を省略できます。

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language)
      ,language
FROM   tableA;
于 2009-06-17T01:43:51.527 に答える
9

私のオラクルは少し錆びていますが、これでうまくいくと思います:

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
于 2009-06-11T19:48:58.450 に答える
2

サブセレクトで RANK() 関数を使用してから、ランク = 1 の行をプルします。

select person, language
from
( 
    select person, language, rank() over(order by language) as rank
    from table A
    group by person, language
)
where rank = 1
于 2009-06-11T19:46:22.903 に答える
0
select person, language     
from table A     
group by person, language  

一意の行を返します

于 2011-07-15T20:23:40.120 に答える
0

効率のために、Harper のようにデータを 1 回だけヒットする必要があります。ただし、rank() を使用すると同点が得られ、さらに言語ごとに並べ替えるのではなく、言語ごとにグループ化したいため、使用したくありません。そこから、order by 句を追加して行を区別する必要がありますが、実際にデータを並べ替える必要はありません。これを達成するには、「order by null」を使用します。

count(*) over (null による言語順でグループ化)

于 2009-06-11T22:04:36.423 に答える