从甲骨文重复行选择两个不同的列的唯一值

问题描述 投票:0回答:3

表格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;
sql oracle oracle11g
3个回答
0
投票

有一个逗号在查询太多:

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_idclass_idin by子句你的分区。


0
投票

所以,你希望每个班输出只出现一次?我认为你需要为更复杂的算法。这里是东西,如果只有两个人在每类“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)))

dbfiddle demo

结果:

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

0
投票

您需要通过条款来改变你的分区,删除多余的逗号也从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;
© www.soinside.com 2019 - 2024. All rights reserved.