如果使用SQL可能存在重复项,如何仅选择不同的行?

时间:2015-06-15 05:22:42

标签: sql database oracle

我有一个棘手的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 ??????? ) 

1 个答案:

答案 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

它首先使用主要作业对属于同一个人的行进行编号,然后仅对每个人进行第一行。

See the documenation of ROW_NUMBER for details