我有一个棘手的SQL查询,我可以使用一些帮助。
我有一个电话目录表,设计得不是很好。它有姓名,电话号码,职位描述和primary_job_indicator。但是,primary_job_indicator并没有完成它的工作。不是每个人都有一个primary_job。
以下是一些示例数据:
fname lname phone email job primary_job_ind
Tim Burton 222-2222 tburton@ok.com manager Y
Jim Classy 222-3333 tclassy@ok.com instructor Y
Jim Classy 222-3333 tclassy@ok.com dept head N
Jane Dill 222-4444 jdill@ok.com janitor N
我想只选择以下一行,每人只有一份工作:
Tim Burton 222-2222 tburton@ok.com manager
Jim classy 222-3333 jclassy@ok.com instructor
Jane Dill 222-4444 jdill@ok.com janitor
我想从表中选择并避免重复的姓名+电话号码+电子邮件。
如果此人在表格中只有一行,我想选择该行。
如果此人在表格中有多行,我只想选择一行 - 具有primary_job_ind =' Y'如果它存在
我无法弄清楚如何做到这一点:
SELECT fname, lname, phone, email, job
FROM phonedirectory
WHERE (( primary_job_ind = 'Y' ) OR ??????? )
答案 0 :(得分:4)
假设没有拼写错误(可能存在),这应该可以完成工作
select fname, lname, phone, email, job
from (
SELECT fname, lname, phone, email, job,
row_number() over (
partition by fname, lname, phone, email
order by primary_job_ind desc
) r
FROM phonedirectory
) where r = 1
它首先使用主要作业对属于同一个人的行进行编号,然后仅对每个人进行第一行。