3

誰かが私を助けてくれることを願っています。

MSサーバー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 に答える