3

我希望有一个人可以帮助我。

我试图在 MS server 2008 上使用 SQL 用户定义函数来执行以下操作

我试图预测客户何时会离开银行,我会通过一系列的抛硬币来做到这一点,直到你离开。抛硬币不一定总是在 50/50,因此我可以将概率作为参数以及当前客户任期传递给函数。

问题是不允许在函数内部使用 RAND(),我不明白为什么,但这很好,必须有原因。

这是我的功能:

create function NewTenure (@tenure integer, @p float) 
returns integer
as
begin
    declare @r float
    declare @newten int
    declare @attrite binary
    set @attrite=0
    set @newten = @tenure
    set @r = RAND()
    while (@attrite = 0)
    begin
        if (@r <= @p) set @attrite = 1;
        if (@r > @p) set @newten = @newten+1    
    end
    return(@newten)
end

正如我所看到的,我需要生成一个介于 0-1 之间的随机值,以便我可以将其与确定客户是否离开的概率进行比较。如果不允许 RAND(),是否有 SQL 技巧在函数内部生成它?(我多年前从学校知道我可以编写自己的随机数生成器,但我不想这样做,也不认为我应该这样做,随机数是人们应该期望的基本计算机功能 -我曾经使用过的任何其他语言都有一个)

我计划在新查询中调用该函数,以在他们离开时使用预测的任期更新临时表,然后将其用于其他复杂的计算。

4

1 回答 1

9

这是一个肮脏的把戏。

CREATE VIEW dbo.vRand
AS
  SELECT r = RAND();
GO

CREATE FUNCTION dbo.fRand()
RETURNS DECIMAL(10,9)
AS
BEGIN
    RETURN (SELECT r FROM dbo.vRand);
END
GO

SELECT name, dbo.fRand()
  FROM sys.all_objects;
于 2012-08-22T19:49:36.030 回答