选择取决于其他列的每个组的最大值

问题描述 投票:0回答:2
 EmpNumber City                                                        Total Sales
 ----------------------------------------------------------------------------------
      1811 Boston                                                      $14557260.03
      1862 Boston                                                      $12435892.06
      1873 Boston                                                       $9786058.60
      1803 Chichago                                                    $18266965.58
      1825 Chichago                                                    $11958100.98
      1877 Chichago                                                    $15569868.52

我的桌子看起来像这样。我可以知道如何根据他们的销售额从特定城市获得最佳员工吗?

所需的输出:

EmpNumber City                                                        Total Sales
----------------------------------------------------------------------------------
     1811 Boston                                                      $14557260.03
     1803 Chichago                                                    $18266965.58

我已经尝试过

select employeenumber, city, max(TotalSales) 
from(
select employeenumber, a.city, sum(quantityordered*priceeach)  as TotalSales
from offices a, employees b, customers c, orders d, orderdetails e
where a.officeCode = b.officeCode
and   b.employeenumber = c.salesrepemployeenumber
and   c.customernumber = d.customernumber
and   d.ordernumber = e.ordernumber
group by employeenumber, a.city
order by a.city)
group by employeenumber, city;

但是我仍然从波士顿获得3名员工,从Chichago获得3名员工。我想要的只是每个城市的一名员工。谢谢

sql oracle
2个回答
0
投票
从上面共享的第一个数据集中创建名为tbl的临时表后,这将为您提供所需的答案。

select EmpNumber, City, Max_Sales as `Max Sales` from (select City, max(`Total Sales`) as `Max_Sales` from tbl group by City) a left join (select `Total Sales` as drop_later, EmpNumber from tbl) b on a.Max_Sales = b.drop_later

这是Spark SQL中的输出:

EmpNumber City Max Sales 0 1811 Boston 14557260.03 1 1803 Chichago 18266965.58


0
投票
只需使用row_number()分析函数:

row_number()

如果TotalSales的最高值出现tie(TotalSales的相等性,并且应该将它们包括在结果中,则将select employeenumber, city, TotalSales 
  from
  (
   select employeenumber, a.city, nvl(quantityordered,0)*nvl(priceeach,0) as TotalSales
          row_number() over 
        ( partition by o.city order by nvl(quantityordered,0)*nvl(priceeach,0) desc ) 
          as rn
     from offices off
     join employees e on off.officeCode = e.officeCode
     join customers c on e.employeenumber = c.salesrepemployeenumber
     join orders ord on c.customernumber = ord.customernumber
     join orderdetails odd on ord.ordernumber = odd.ordernumber
   )
 where rn = 1
替换为row_number(),这是另一个分析函数。
© www.soinside.com 2019 - 2024. All rights reserved.