2017-08-25 44 views
0

有人可以帮助我理解相关查询。以下是我试图理解的查询,但无法从中获得任何信息。请帮助。谢谢。无法理解相关查询

--Step 1 
    select e1.Name as 'Employee', e1.Salary 
    from Employee e1 
    where 3 > 
    (
     select count(distinct e2.Salary) 
     from Employee e2 
     where e2.Salary > e1.Salary 
    ) 
    ; 




--Step 2 
SELECT 
    d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary 
FROM 
    Employee e1 
     JOIN 
    Department d ON e1.DepartmentId = d.Id 
WHERE 
    3 > (SELECT 
      COUNT(DISTINCT e2.Salary) 
     FROM 
      Employee e2 
     WHERE 
      e2.Salary > e1.Salary 
       AND e1.DepartmentId = e2.DepartmentId 
     ) 
; 
+0

在第一步,他们希望得到少于3个不同的E1的员工那些有较少的薪水比较E2员工而在2日,他们希望得到同样为第哪来部门一样 – user3712320

+0

好,考虑到第一个查询,你有一个问题,因为第一个查询并没有真正做到(我认为)它试图做的事情 - 我认为哪一个是返回员工薪水最高的三名员工。 – Strawberry

+0

我也不明白。假设你必须改变别人的工作,那么从头开始可能会更好。 –

回答

0

在第一个查询你正在返回所有e1.Name和e1.Salary如雇员有2个或更少的记录,他们的工资比E1大。

第二个查询做同样的事情,但只有当员工没有改变部门。

0

一个合法的查询来查找员工与前3名的薪水可能如下:

SELECT x.* 
    FROM employee x 
HAVING FIND_IN_SET(salary,(SELECT GROUP_CONCAT(DISTINCT salary ORDER BY salary DESC) FROM employee)) <= 3; 

注:此方法可以返回超过300名员工,如果员工共享同样的薪水

0

让我们打破他们下来:

第1步 - 返回所有在前2名工资(3> x)工资的雇员。

  • (SELECT)返回所有员工的名字和他们的工资
  • (FROM)的职员表
  • (WHERE)排除没有薪水的前2谁员工的子查询只计算工资数量大于当前评估记录。如果这个数字超过2,那么这个人在前3名没有工资。3> 4 = 3> 3将被拒绝,记录被排除。

SELECT e1.Name as 'Employee', e1.Salary 
FROM Employee e1 
WHERE 3 > (SELECT count(distinct e2.Salary) 
      FROM Employee e2 
      WHERE e2.Salary > e1.Salary); 

另一种方式来写这个查询将

SELECT * 
FROM Employee E1 
WHERE EXISTS (SELECT * 
       FROM Employee E2 
       WHERE E1.Salary = E2.Salary 
       ORDER By salary Desc 
       LIMIT 2) 

以上基本上说返回顶部2薪水和谁拥有那些薪水的一个员工。

步骤2与步骤1相似;但由于相关性也在部门中,因此结果不同。对于每个员工来说,它确定薪水是否是该部门的前两名之一。如果是包含的记录。这意味着顶部2薪金由部门,而不是公司的评估宽像步骤1

第2步也可以但是重新编写,

在除了MySQL的语言中,这可以表示为:

  1. 使用窗口/分析函数Dense_rank()和按部门划分;然后将记录限制为排名不超过2的人
  2. 使用交叉申请和按薪水desc排序的前2名。
  3. mySQL列出的方法是使用用户变量的最简单的方法。以模拟窗口功能或交叉应用上面。