2

2 つの列でグループ化し、これら 2 つの列の別の列の ID が最大値である行のみを戻す必要があります。私が求めている詳細は、4番目の列にあり、回答と呼ばれます

COLUMN1 | COLUMN2 | NUMBERCOL  |  Answer
--------------- ----------------------------
 123    |   456   |      1     |    a
 123    |   456   |      2     |    x
 123    |   456   |      3     |    s
 654    |   564   |      1     |    a
 654    |   564   |      2     |    s
 654    |   564   |      3     |    p
 654    |   564   |      4     |    b

したがって、最初のグループ化結果からの回答 s と、2 番目のグループ化結果からの回答 b が必要です

4

2 に答える 2

3

サブクエリを使用してJOIN、結果を取得できます。

select t1.column1,
  t1.column2,
  t1.numbercol,
  t1.answer
from yourtable t1
inner join
(
  select column1, column2,
    max(numbercol) MaxNum
  from yourtable
  group by column1, column2
) t2
  on t1.column1 = t2.column1
  and t1.column2 = t2.column2
  and t1.numbercol = t2.MaxNum

デモで SQL Fiddle を参照してください

于 2013-02-21T16:32:58.497 に答える
2

これには分析関数を使用できます。

select t.*
from (select t.*,
             row_number() over (partition by column1, column2 order by numbercol desc) as seqnum
      from t
     ) t
where seqnum = 1

これは、データを集計するのではなく、行に連続番号を割り当てることによって機能します。連番は (column1, column2) の新しい値ごとに最初からやり直され、順序は numbercol によって決定されます。最大の numbercol は値 1 を取得し、2 番目に高い値は 2 というようになります。これは、Oracle の分析関数 (他のデータベースでは「ウィンドウ」関数と呼ばれます) の例です。

最後のwhere句は、目的の行 (numbercol が最大の行) を選択します。

于 2013-02-21T16:30:57.547 に答える