为啥 DISTINCT 在这种情况下不起作用? (SQL)
Posted
技术标签:
【中文标题】为啥 DISTINCT 在这种情况下不起作用? (SQL)【英文标题】: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
而不是DISTINCT
,sql.sh/cours/distinct
【参考方案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.com 或dbfiddle.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 的薪水都一样
他们在同一个部门
【讨论】:
以上是关于为啥 DISTINCT 在这种情况下不起作用? (SQL)的主要内容,如果未能解决你的问题,请参考以下文章