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
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
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;
形如:
select * from
(
select * from T_TABLE
order by valueB desc, valueA desc
)
where rownum <= 1
------------------------------------
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也是不符合要求.
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) 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
------------------------------------
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的没见过 ,等下试试。
(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
( 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 ;
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;
thks all.