需要了解此查询的解决方案

sqyvllje  于 2021-08-13  发布在  Java
关注(0)|答案(5)|浏览(214)

我们将雇员的总收入定义为他们每月的工作收入,最大总收入定义为雇员表中任何雇员的最大总收入。编写查询以查找所有员工的最大总收入以及总收入最大的员工总数。然后将这些值打印为空格分隔的整数。为了更好地理解这个问题,这是一个链接https://www.hackerrank.com/challenges/earnings-of-employees/problem
我是sql的初学者,无法理解给出的解决方案

1.SELECT (months*salary) as earnings,
 2.COUNT(*) FROM Employee
3. GROUP BY earnings
4. ORDER BY earnings DESC
 5.LIMIT 1;

我理解第一步,我们给月薪一个别名,它是收入,第二步,我们从雇员表中计算雇员人数。我不明白为什么我们在这里使用group by,第4步和第5步也很清楚,我们使用order by子句是为了将收益从高到低排列,限制1将获取最高值。但为什么要分组呢?忽略1,2,3,4,5。这些只是我为了更清晰而使用的数字

8nuwlpux

8nuwlpux1#

第三步: GROUP BY earnings 用于将相同价值的收益组合在一起。例如,如果你有3000美元的收入,其中有3个,它们将被分组在一起。 GROUP BY 也需要与聚合函数结合使用 COUNT(*) . 否则, COUNT(*) 将不工作并返回错误。
第四步: ORDER BY earnings DESC 用于按降序排列分组收益。也就是说,从最高收益到最低收益。
第五步: LIMIT 1 将返回的行数限制为1。
希望这有帮助!:)

oymdgrw7

oymdgrw72#

按聚合结果分组。当存在多个具有相同值的“收益”时,表中只有一个值。

3duebb1j

3duebb1j3#

您错误地拆分了查询。
必须是:

SELECT (months*salary) as earnings, -- 2 and 4
       COUNT(*)                     -- 4
FROM Employee                       -- 1
GROUP BY earnings                   -- 3
ORDER BY earnings DESC              -- 5
LIMIT 1;                            -- 6

步骤1-表格 Employee 用作数据源
步骤2-表达式的值 (months*salary) 对于表中的每条记录
步骤3-将具有(2)中表达式的相同值的记录视为一个组
步骤4-对于每个组,(2)中表达式的值放入输出缓冲区,计算组中记录的数量并将其添加到输出缓冲区
步骤5-输出缓冲区中的行按(2)中的表达式降序排列
步骤6-返回缓冲区中的第一行(即具有(2)中表达式的最大值的行)。

lx0bsm1f

lx0bsm1f4#

SELECT TOP 1 (months * salary), COUNT( * ) 
  FROM Employee GROUP BY (months * salary) 
  ORDER BY (months * salary) DESC;

对于ms sql server,请使用以上选项。

jum4pzuy

jum4pzuy5#

尝试此查询:

SELECT months*salary,COUNT(*) FROM Employee GROUP BY months*salary having count(*) = 7 ORDER BY months*salary DESC;

相关问题