日期:2014-05-17  浏览次数:21021 次

对两列使用 max函数 的sql语句
T_TABLE   表结构:
p_code,pid,valueA,valueB,remark


在同一记录集里,取valueA、valueB的最大值,并且valueB优先。

例:
p_code     pid     valueA     valueB     remark
------------------------------------
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  


------解决方案--------------------
最终目的不是取记录吗?排序不行吗
形如:
select * from
(
select * from T_TABLE
order by valueB desc, valueA desc
)
where rownum <= 1
------解决方案--------------------
楼主一开始应该描述清楚嘛,这样行么
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
------解决方案--------------------
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


------解决方案--------------------
呵呵,不好意思,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 ;

------解决方案--------------------
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;