【问题标题】:How to select only distinct row when there might be duplicates using SQL?当使用 SQL 可能存在重复时,如何仅选择不同的行?
【发布时间】:2015-06-15 05:22:41
【问题描述】:

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

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:

    假设没有错字(可能有),这应该可以完成工作

    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

    【讨论】:

    • Jens 速度很快,答案很完美。我有点晚了。 SQLFiddle 示例是here。 Jens 在 phonedirectory 之后有一个额外的括号,已在小提琴中更正。
    猜你喜欢
    • 2011-03-05
    • 2013-12-22
    • 2020-10-16
    • 1970-01-01
    • 2014-07-31
    • 2021-07-14
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多