首页 > 解决方案 > 如何根据学生的电话类型优先级仅选择一行

问题描述

你好,谢谢你帮助我。

一个学生可以有多个电子邮件地址,其类型为:个人、工作、其他、学校

我需要编写一个查询,为学生选择一个电子邮件地址。如果学生有多个电子邮件地址,则选择的电子邮件地址需要基于电子邮件地址的电子邮件类型。

例如,

电子邮件类型的优先顺序是:个人、学校、工作、其他。目标是根据优先级列表仅选择一个记录(个人、学校、工作,然后是其他)

学生表结构

student_id
email_type
email_addr

标签: sqloraclegreatest-n-per-group

解决方案


您可以使用窗口函数和case表达式:

select *
from (
    select t.*,
        row_number() over(
            partition by student_id 
            order by case email_type 
                when 'personal' then 1
                when 'school' then 2
                when 'work' then 3
                else 4
            end 
        ) rn
    from mytable t
) t
where rn = 1

在 Oracle 中,您可以使用以下命令缩短它decode()

select *
from (
    select t.*,
        row_number() over(
            partition by student_id 
            order by decode(email_type, 'personal', 1, 'school', 2, 'work', 3, 4)
        ) rn
    from mytable t
) t
where rn = 1

另一个典型的解决方案是fetch first row with ties

select t.*
from mytable t
order by row_number() over(
    partition by student_id 
    order by decode(email_type, 'personal', 1, 'school', 2, 'work', 3, 4)
)
fetch first row with ties

推荐阅读