sql - 如何根据学生的电话类型优先级仅选择一行
问题描述
你好,谢谢你帮助我。
一个学生可以有多个电子邮件地址,其类型为:个人、工作、其他、学校
我需要编写一个查询,为学生选择一个电子邮件地址。如果学生有多个电子邮件地址,则选择的电子邮件地址需要基于电子邮件地址的电子邮件类型。
例如,
- 如果学生有个人电子邮件,那么我只选择个人电子邮件。
- 如果学生没有个人电子邮件但有其他电子邮件类型,那么我将选择他们的学校电子邮件地址。
电子邮件类型的优先顺序是:个人、学校、工作、其他。目标是根据优先级列表仅选择一个记录(个人、学校、工作,然后是其他)
学生表结构
student_id
email_type
email_addr
解决方案
您可以使用窗口函数和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
推荐阅读
- postgresql - 如何防止在硬关机后启动时删除 pg wals?
- mysql - 如何在 MySQL 中根据优先级和最高结束日期删除重复行?
- apache-spark - spark-submit 覆盖默认 application.conf 不起作用
- ros - [topicname] 观察缓冲区在 [X] 秒内没有更新,应该每 [Y] 秒更新一次
- java - Intellij 设置设置为 CNY 货币,但我想要 $
- android - AndroidRuntime:致命例外:androidmapsapi-ZoomTableManager
- react-native - 在我处理表单验证时导航服务不起作用
- python - 如何通过matplotlib分离绘制的图形
- java - java.lang.NoClassDefFoundError:如何获取类路径?
- azure-data-factory - Azure 数据工厂 (ADF) 是否支持链接服务 Azure Cosmos DB(表 API)?