【发布时间】:2020-07-20 00:04:42
【问题描述】:
我很难开发适当的标量函数以按预期工作。它需要输入货币类型。我有一个 Products 表,其中包含我关注的 UnitPrice 列。我需要我的功能按单价的降序对产品进行排序,最大的价格排名 1,下一个排名 2 等。相同的价格应该排名相同,排名数字必须按顺序连续分配,不能跳过或跳跃任何数字。也就是说,排名应该看起来像 1、2、3、4、5、......、61 和 62。 然后,我的函数将找到单价等于输入货币价值的产品的排名,并返回排名编号。如果 Products 表中不存在输入货币值,则返回 -1。例如,因为有四种产品的单价为 18 美元,并且它们都排在第 40 位,所以 RankOfGivenPrice(18) 应该返回 40。因为没有产品的单价为 5.00 美元,所以 RankOfGivenPrice(5) 返回 -1。
我的尝试:
go
create function RankOfGivenPrice
(@unitprice money)
returns money
begin
return
(select TOP 1
rank() over(order by UnitPrice desc) as RankNum
from Products
where UnitPrice = @unitprice)
end
go
这可以编译,但它不会产生我需要的输出。我调用 select dbo.RankOfGivenPrice(18) 之类的函数,但它返回 1.00。如果我不使用 TOP 1,我会收到“子查询返回超过 1 个值”。函数调用错误。我假设我应该使用 RANK() 函数,但子查询很难。
【问题讨论】:
标签: sql sql-server tsql window-functions sql-function