|
经过两天的努力, 终于大功告成。
with thand as (select rownum line, 'A' player, p1 hand from euler_poker
union all
select rownum line, 'B' player, p2 hand from euler_poker
)
,trow as (select rownum rn from dual connect by rownum<=5)
,th1 as (select line, player,hand, rn, translate(substr(hand,rn*3-2,1),'TJQKA', 'ABCDE') val,
substr(hand,rn*3-1,1) suit from thand, trow)
,tsort as (select line, player,hand, row_number() over (partition by line,player,hand order by valcnt desc, val desc) rn, val, suit, valcnt
from (select line, player,hand, val, suit, count(*) over (partition by line,player,hand,val) valcnt
from th1 order by count(*) over (partition by line,player,hand, val) desc, val desc))
,tvalsort as (select line, player,hand, replace(sys_connect_by_path(val, '/'),'/','') valsort,
replace(sys_connect_by_path(valcnt, '/'),'/','') valcnt,
replace(sys_connect_by_path(suit, '/'),'/','') suitsort
from tsort where level=5 connect by line=prior line and player=prior player and hand=prior hand and rn=prior rn+1)
,tvalsuit as (select line, player,hand, valsort, valcnt,length(translate( 'DSCH', suitsort|| 'DSCH', suitsort)) suitcnt from tvalsort)
,trank as (select line, player,hand,
case when suitcnt = 1 and valcnt='11111' and to_number(substr(valsort,1,1),'X') - to_number(substr(valsort,5,1),'X')=4 then '9'
when suitcnt = 1 then '6'
when valcnt='11111' and to_number(substr(valsort,1,1),'X') - to_number(substr(valsort,5,1),'X')=4 then '5'
when valcnt='44441' then '8'
when valcnt='33322' then '7'
when valcnt='33311' then '4'
when valcnt='22221' then '3'
when valcnt='22111' then '2'
else '0'
end || valsort rk
from tvalsuit)
select count(*)
from trank t1, trank t2
where t1.line=t2.line and t1.player='A' and t2.player='B' and t1.rk>t2.rk
COUNT(*)
----------
376
Executed in 0.516 seconds |
|