如何从 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
我正在尝试从每个地区收集顶级客户,但我似乎 运行 遇到无法指定我只想要顶级客户的问题。
我不断收到此错误: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