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;

我想要的输出是


1 abxw --最长的字符串

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

当然,这样做的好处是,如果您决定需要另一个 tiebreak(例如,按字母顺序),您只需将其添加到您的 order by 子句中。顺便说一句,这不是一个坏主意,这样您的结果集就不会是不确定的。

于 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

如果您只想要一条记录,则可以执行以下操作:

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 回答