如何从 dense_rank() 中获取前 n 行

How to get top n rows from a dense_rank()

我正在尝试从每个地区收集顶级客户,但我似乎 运行 遇到无法指定我只想要顶级客户的问题。

我不断收到此错误:ORA-00904: "RANK_UNITPRICE": invalid identifier 我知道它来自 where 语句,但我不知道如何过滤以获得我的预期输出。

我的代码如下所示:

select reg_name, cus_lname, sum(sale_units *  sale_price) as total_sold,
rank() over (partition by reg_name order by sum(sale_units *  sale_price) desc) as rank_unitprice
from dwregion
inner join dwcustomer on dwregion.reg_id = dwcustomer.reg_id
inner join dwsalesfact on dwcustomer.cus_code = dwsalesfact.cus_code
where rank_unitprice = 1
group by reg_name, cus_lname

如果我从 where 语句中取出它,代码会按预期正常工作(正确的排名和正确的值)但它未过滤(显然)。

我该如何解决这个问题?

我正在使用 Oracle live,如果有帮助,您可以找到脚本 here

起初我不明白你应该做什么(“从代码中取出 where 子句”)不起作用。然后我意识到你可能做错了——这里的“out”意味着当前查询应该是一个 subquery (或 CTE)。像这样:

WITH
   temp
   AS
      (  SELECT reg_name,
                cus_lname,
                SUM (sale_units * sale_price) AS total_sold,
                RANK ()
                   OVER (PARTITION BY reg_name
                         ORDER BY SUM (sale_units * sale_price) DESC) AS rank_unitprice
           FROM dwregion
                INNER JOIN dwcustomer ON dwregion.reg_id = dwcustomer.reg_id
                INNER JOIN dwsalesfact
                   ON dwcustomer.cus_code = dwsalesfact.cus_code
       GROUP BY reg_name, cus_lname)
SELECT t.*
  FROM temp
 WHERE t.rank_unitprice = 1