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;