我的表ROLE由4列组成,Comid,Memberid,Houseid和Membertype。在houseid中有多个成员类型,其元素类型为HEAD或MEM,但是作为HEAD的成员也将拥有另一个记录,其中他是MEM,其后是MEM类型的其他成员。我的要求是在Houseid上对表进行分区,并为每个成员提供一个排名情况0为membertype HEAD,case 1为membertype MEM等等,但是一个HEAD的成员最终得到两个排名0和1,我只需要给他排名第0,并以1,2,3等排在其他成员之后,一个HOUSEID中只能有1个HEAD。这是我尝试但没有成功
select Comid, Memberid, Houseid, Membertype,
rank() over (partition by Houseid, case when MEMBERTYPE 'HEAD' then 0 else 1 end)
from ROLE
我的查询有效,但MEMBERTYPE ='HEAD'最终得到两个等级0和1,我只想为HEAD排名0并排除他所在的记录。
答案 0 :(得分:0)
您需要不同级别的窗口功能。第一个为家庭头部的所有行分配“HEAD”。第二个是rank()
:
select Comid, Memberid, Houseid, Membertype,
rank() over (partition by Houseid order by isHead, memberid) as seqnum
from (select r.*,
max(case when membertype = 'HEAD' then 1 else 0 end) over (partition by HouseId) as isHead
from ROLE r
) r;