T_TABLE 表结构:
p_code,pid,valueA,valueB,re
在同一记录集里,取valueA、valueB的最大值,并且valueB优先。例:
p_code  pid  valueA  valueB  re
------------------------------------
001     99   200     3       xxx
002     99   100     6       xxx如果只是取valueA的最大值,那就是取第一行,但是业务要求,需要考虑
第二行,上面的记录集里是第二行的valueB值大,
所以舍去第一行,最后应该取第二行的记录。不知道这样的需求用一条sql语句能否写出来?不然就要通过应用程序多次的访问
数据库才能达到目的。
如果只考虑valueA的最大值:
select pid,MAX(valueA) from T_TABLE where p_code in('001','002')
group by pid 但是需要同时考虑valueA和valueB,并且valueB优先.......
这样是肯定不行的:
select pid,MAX(valueA),MAX(valueB) from T_TABLE where p_code in('001','002')
group by pid 

解决方案 »

  1.   

    你的要求其实是取valueB最大的一行的数据而不是取最大的valueA和valueB值,如果满足条件p_code in ('001', '002')的记录中valueB最大的纪录如果有多条,再取valueA的最大值,是这样吗?select   pid, max (valuea), valueb
        from t_table x
       where p_code in ('001', '002') and valueb = (select max (valueb)
                                                      from t_table
                                                     where pid in ('001', '002'))
    group by pid, valueb;
      

  2.   

    最终目的不是取记录吗?排序不行吗
    形如:
    select * from
    (
     select * from T_TABLE
     order by valueB desc, valueA desc
    )
    where rownum <= 1
      

  3.   

    p_code  pid  valueA  valueB  re
    ------------------------------------
    001     99   200     3       xxx
    001     97   150     0       xxx 
    002     99   100     6       xxx
    002     98   100     0       xxx
    按照这个记录集,业务要求是pid相同的,取valueB的最大值,
    如果valueB相同的,取valueA的最大值。
    所以应该是返回2、3、4行数据。根据KingSunSha
    不行,不满足要求:
    首先是子句返回的是最大的valueB,也就是valueB=6,这样的话,
    外层的sql的条件就是valueB=6,最后就只出来第三行数据了。
    killlaoli也是不符合要求.
      

  4.   

    可以尝试一下分析函数:
    select pid,valueA,valueB from
    ( select pid,valueA,valueB, rank() over (partition by pid order by valueA desc valueB desc) ordernum from T_TABLE where ordernum = 1 )
    order by pid;
      

  5.   

    楼主一开始应该描述清楚嘛,这样行么
    SELECT pid,max(valueA) valueA,valueB from T_TABLE where (pid,valueB) in (
      SELECT  pid,valueA,max(valueB) valueB from  T_TABLE group by pid,valueA 
      )
    group by pid,valueB
      

  6.   

    p_code  pid  valueA  valueB  re
    ------------------------------------
    001     99   200     3       xxx
    001     97   150     0       xxx 
    002     99   100     6       xxx
    002     98   100     0       xxxicefirelxb的sql是肯定不行的,我一开始也是类似这样的写。首先子句的意思就是以pid,valueA为组标识进行分组,取出组内最大值 ,这样的话,根据记录集,四条记录的(pid,valueA)为标识的话,都是不一样的,所以四条记录都返回,然后外层的sql有根据(pid,valueB)为分组标识,所以也是4条记录都返回。最后,语句会抱错:值过多。TodayZ的没见过 ,等下试试。
      

  7.   

    select p_code,pid,valueA,valueB from
    (select p_code,pid,valueA,valueB,row_number()over(partition by pid order by pid,valueb desc,valuea desc)r from T_TABLE 
    ) where r=1
      

  8.   

    根据pid分组,然后在按照valueb,valuea排序,那么第一条就是你所需要的数据
      

  9.   

    shangqiao 的可以, 用了一下,满足要求。TodayZ 的抱错 说没有右括号。不过和shangqiao 的也是一样的思路。还有没有其他的语句?准备关门放分了。
      

  10.   

    呵呵,不好意思,desc后面少了一个逗号,Try again.select pid,valueA,valueB from
    ( select pid,valueA,valueB, rank() over ( partition by pid order by valueA desc, valueB desc) ordernum from T_TABLE where ordernum = 1 )
    order by pid ;
      

  11.   

    SELECT   pid, MAX (valuea), valueb
    FROM     t_table x
    WHERE    p_code IN ('001', '002') AND (pid, valueb) = (SELECT pid, MAX (valueb)
                                                           FROM   t_table
                                                           WHERE  p_code IN ('001', '002'))
    GROUP BY pid, valueb;
      

  12.   

    KingSunSha上面这条sql也可以,也比那个rank()语句好理解一些。
    thks all.