表格1
school_Name Student_Name Class_ID
AMM joe AMM-1-1-1
AMM joe AMM-1-1-2
AMM Adam AMM-1-1-1
AMM Adam AMM-1-1-2
AMM Nancy AMM-1-2-1
AMM Nancy AMM-1-2-2
AMM Albert AMM-1-2-1
AMM Albert AMM-1-2-2
IRB Frank IRB-1-1-1
IRB Frank IRB-1-1-2
IRB Mike IRB-1-1-1
IRB Mike IRB-1-1-2
您好,我有类似的表上面的Oracle,并试图选择在校学生姓名的第一个比赛唯一标识码(class_id)(1)。任何人都可以请帮助。
select语句如下的预期输出:
结果
school_Name Student_Name Class_ID
AMM joe AMM-1-1-1
AMM Adam AMM-1-1-2
AMM Nancy AMM-1-2-1
AMM Albert AMM-1-2-2
IRB Frank IRB-1-1-1
IRB Mike IRB-1-1-2
下面尝试,但预期仍然没有工作。
select
school_name,
student_name,
class_id,
from
(
select
school_name,
student_name,
class_id,
row_number() over (partition by class_id order by student_name ASC) rn
from studentdata_view
) where rn = 1;
有一个逗号在查询太多:
select
school_name,
student_name,
class_id -- <=== it was here; I removed it
from
(
select
school_name,
student_name,
class_id,
row_number() over (partition by class_id order by student_name ASC) rn
from studentdata_view
) where rn = 1;
我也改变full_class_id
到class_id
in by子句你的分区。
所以,你希望每个班输出只出现一次?我认为你需要为更复杂的算法。这里是东西,如果只有两个人在每类“rivalizing”,就像在你的榜样应该怎样工作:
select *
from (
select school_name,student_name, class_id,
dense_rank() over (partition by school_name, class_id order by student_name) rnk,
count(distinct student_name) over (partition by school_name, class_id) cnt,
row_number() over (partition by school_name, student_name order by class_id ) rn
from studentdata_view)
where cnt = 1
or (cnt = 2 and ((rnk = 1 and rn = 1) or (rnk = 2 and rn = 2)))
结果:
SCHOOL_NAME STUDENT_NAME CLASS_ID RNK CNT RN
----------- ------------ --------- ---------- ---------- ----------
AMM Adam AMM-1-1-1 1 2 1
AMM joe AMM-1-1-2 2 2 2
AMM Albert AMM-1-2-1 1 2 1
AMM Nancy AMM-1-2-2 2 2 2
IRB Frank IRB-1-1-1 1 2 1
IRB Mike IRB-1-1-2 2 2 2
您需要通过条款来改变你的分区,删除多余的逗号也从1日之前
select school_name,student_name,class_id from
(
select school_name,student_name,class_id, row_number() over (partition by
school_name,student_name order by class_id ASC) rn from studentdata_view
)A where rn = 1;