3

同じIDフィールドの文字列値が最も長い行を取得する必要があります。

create table test(
id number,
test_data varchar2(20)
);

insert all      
    into test values (1,'aaa')
    into test values (1,'a')
    into test values (1,'abxw')
    into test values (2,'aaa')
    into test values (2,'tris')
select * from dual;

私の希望する出力は


1abxw-最長の文字列

2トリス

どうすれば必要な出力を取得できますか?何もわかりません。

みんなカーソルを使うのはどうですか。この目的でカーソルを使用できますか?誰かが何か考えを持っていますか?出来ますか??

ありがとうございました。

4

3 に答える 3

8

私はこれらの種類のクエリにパーティションを使用するのが好きです:

select id,test_data from (
  select
  id, test_data, 
     row_number() over( partition by id order by length(test_data) desc) as rnum
from
  test 
) where rnum=1

http://www.sqlfiddle.com/#!4/66d4c/20

もちろん、これの良いところは、別のタイブレークが必要だと判断した場合(たとえば、アルファベット順)、それをorderby句に追加するだけでよいことです。ちなみに、これは悪い考えではありません。そうすれば、結果セットが非決定論的になることはありません。

于 2012-09-11T03:06:59.170 に答える
2

このクエリを試すことができます。複数の文字列のIDあたりの長さが最も長い場合、複数の結果が返されます。

select
  t1.id, t1.test_data
from
  test t1
join
  (select id, max(length(test_data)) as len from test group by id) t2
    on t1.id = t2.id and length(t1.test_data) = t2.len

デモ:http ://www.sqlfiddle.com/#!4 / 66d4c / 6

于 2012-09-11T02:59:01.897 に答える
2

分析(ウィンドウ)関数RANK()がこれを達成するための最良の方法だと思います。

SELECT id, test_data FROM (
    SELECT id, test_data
         , RANK() OVER ( PARTITION BY id ORDER BY LENGTH(test_data) DESC ) AS the_rank
      FROM test
) WHERE the_rank = 1

レコードが1つだけ必要な場合は、次のように実行できます。

SELECT id, test_data FROM (
    SELECT id, test_data
         , RANK() OVER ( PARTITION BY id ORDER BY LENGTH(test_data) DESC ) AS the_rank
      FROM test
     ORDER BY the_rank
) WHERE rownum = 1
于 2012-09-11T03:07:50.830 に答える