获取相同ID值中字符串最长的字段

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 tris

我应该如何获得所需的输出?我没有任何想法。

伙计们,使用光标怎么样?我们可以用光标来实现吗?有人有什么想法吗?这可能吗?

谢谢。


如果两个字符串的长度和ID相同,会怎样? - mellamokb
感谢您的查询,在这种情况下,任何人都可以被选择,但只能选择一个值。 - sam
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

当然,使用这种方法的好处是,如果你决定需要另一种排序方式(例如按字母顺序),只需将其添加到order by子句中即可。顺便说一下,这样做也不错,这样你的结果集就不会是非确定性的。


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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接