【问题标题】:Why doesn't DISTINCT work in this case? (SQL)为什么 DISTINCT 在这种情况下不起作用? (SQL)
【发布时间】:2021-07-18 04:42:03
【问题描述】:

SELECT DISTINCT 
  employees.departmentname, 
  employees.firstname, 
  employees.salary, 
  employees.departmentid
FROM employees
JOIN (
  SELECT MAX(salary) AS Highest, departmentID 
  FROM employees 
  GROUP BY departmentID
) departments ON employees.departmentid = departments.departmentid 
             AND employees.salary = departments.highest;

为什么 DISTINCT 在这里不起作用? 我试图让每个部门只显示一次,因为问题是询问每个部门的最高薪水。

【问题讨论】:

  • DISTINCT 关键字删除“整个重复行”。如您所见,您的示例中没有重复的行。
  • 部门名称和部门ID重复
  • @Asenar 。 . .您的评论是错误的,您应该删除它。
  • 好的@GordonLinoff 我刚刚做了,但你确定吗?我不太了解Oracle,但我很快搜索(在您发表评论后),似乎作者可能想使用UNIQUE 而不是DISTINCTsql.sh/cours/distinct

标签: sql oracle greatest-n-per-group


【解决方案1】:

使用ROW_NUMBER()函数,如:

select departmentname, firstname, salary, departmentid
from (
  select e.*,
    row_number() over(partition by departmentid, order by salary desc) as rn
  from employees e
) x
where rn = 1

【讨论】:

  • 请在db-fiddle.comdbfiddle.uk 创建一个小提琴。
  • 它说错误 - “FROM 关键字未在预期的位置找到”
  • @JayLi 既然你现在提到它是为 Oracle 设计的,我就对其进行了调整。再试一次。
【解决方案2】:

我试图让每个部门只显示一次,因为问题是询问每个部门的最高薪水。

使用窗口函数:

SELECT e.*
FROM (SELECT e.*,
             ROW_NUMBER() OVER (PARTITION BY departmentID ORDER BY salary DESC) as seqnum
      FROM employees e
     ) e
WHERE seqnum = 1;

这保证每个部门返回一行,即使存在平局。如果您希望在有平局时所有行,请改用RANK()

【讨论】:

  • 我输入了每一个字,但它返回一个错误,我发布了上面的图片。
  • @JayLi 不,您错过了 as 关键字后面的 seqnum 别名。看起来您输入了您可以看到的内容,但没有移动滚动条来查看答案右侧溢出的其余文本。
【解决方案3】:

为什么 DISTINCT 在这里不起作用?

DISTINCT 不是函数;它是一个关键字,当 ALL 列值重复时将消除重复行。它确实适用于单个列。

DISTINCT 关键字“有效”(即完成了预期的工作),因为不存在所有列值与另一行值重复的行。

但是,它并没有解决您的问题,因为DISTINCT 不是解决您问题的正确方法。为此,您想要“获取 [每个组内] 列的最大值的行”(as per this question)

【讨论】:

    【解决方案4】:

    Gwen、Elena 和 Paula 的薪水都一样

    他们在同一个部门

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 2010-12-29
      • 1970-01-01
      • 2021-08-05
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多