1

「SQLでループを使用している場合、おそらく間違っている」と読んだので、ここにたどり着きました。ただし、質問の前に、シナリオの背景について説明します。次のデータベース構造があります。

  • 「ユーザー」には次のものがあります。
    • UserID int IDENTITY (PK)
    • 信頼性フロート
  • 「UserSubmissions」には次のものがあります。
    • バリューフロート
    • UserID int (FK) (PK)
    • SubmissionID (FK) (PK)
    • タイムスタンプ日時 (PK)
  • 「GlobalSubmissions」には次の機能があります。
    • IdealValue フロート
    • 提出ID (PK)

GlobalSubmissions は、理想的にはユーザーが送信する必要がある理想的な値を含むテーブルと考えてください。UserSubmissions は、ユーザーが送信した値を含むテーブルです。

ユーザーの「送信」を単一の特定の「globalSubmission」と比較することで、ユーザーの信頼性を推定する関数を作成しました。

CREATE FUNCTION dbo.GetUserReliabilityForSubmission(@userID int, @submissionID int)
RETURNS float
AS
BEGIN

    DECLARE @userAverageValue float,
    @idealValue float;

    SET @userAverageValue = (
        SELECT AVG (Value)
            FROM UserSubmissions
        WHERE (UserID = @userID AND SubmissionID = @submissionID));

    SET @idealValue = (
        SELECT IdealValue
        FROM Submission
        WHERE (SubmissionID = @submissionID));

    RETURN 1 - ABS(@userAverageValue - @idealValue);
END

これは機能しますが、特定の 1 つの送信 ID のみに基づいてユーザーの信頼性を計算します。ユーザーの「グローバルな」信頼性を計算したい場合は、ループを使用して、ユーザーがこれまでに送信したすべての個別のSubmissionIDを調べて、その手順を実行する必要があります。

この場合、ループを使用する代わりに良い方法はありますか?

4

1 に答える 1

2
SELECT d.UserID, 1 - AVG(ABS(d.avg - d.IdealValue))
FROM (
  SELECT us.UserID, gs.SubmissionID, gs.IdealValue, AVG(us.Value) as avg FROM UsersSubmissions us
  JOIN GlobalSubmissions gs ON gs.SubmissionID = us.SubmissionID
  GROUP BY us.UserID, gs.SubmissionID, gs.IdealValue) d
GROUP BY d.UserId

作業例: http://sqlfiddle.com/#!6/8d880/8

ただし、それは信頼性を定義する優れた方法ではないと思います。次のように変更することを検討する必要があると思います。

SELECT d.UserID, 1 - AVG(ABS(d.avg - d.IdealValue) / ABS(d.IdealValue))
FROM (
  SELECT us.UserID, gs.SubmissionID, gs.IdealValue, AVG(us.Value) as avg FROM UsersSubmissions us
  JOIN GlobalSubmissions gs ON gs.SubmissionID = us.SubmissionID
  GROUP BY us.UserID, gs.SubmissionID, gs.IdealValue) d
GROUP BY d.UserId

そして例: http://sqlfiddle.com/#!6/8d880/14

変化は何ですか?値自体に対して相対的に間違いを取ります。実際には6のときにx = 5と言うのと、 501のときにx = 500と言うのには違いがあります。

于 2013-03-16T11:24:04.837 に答える