用于计算分数的 UDF - 根据预定义的参数对输入进行评分

Posted

技术标签:

【中文标题】用于计算分数的 UDF - 根据预定义的参数对输入进行评分【英文标题】:UDF to calculate a score - Input is scored on predefined parameters 【发布时间】:2013-09-08 07:25:45 【问题描述】:

我正在尝试创建一个 SQL Server 用户定义函数 (UDF),它计算分数并在表创建过程中应用该函数。

该表有以下列:

MemberID(PK)
Gender 
Name
DOB
Weight
Height
SmokingHabit
Salary
CalculatedScore

计算的分数是根据下面每个单独分数的总和计算得出的

参数

年龄

如果年龄在 20-30 之间,则得分为 5 如果年龄在 31-40 之间,则得分为 4 如果年龄在 41-50 之间,则得分为 3 如果年龄 >50 则得分为 2

体重(公斤)/身高(米)

如果介于 20-25 之间,则为 1 如果介于 25-30 之间,则得分为 3 如果介于 30-35 之间,则得分为 5 如果介于 35-40 之间,则得分为 2

吸烟者

如果吸烟者状态为“是”,则得分为 0 如果吸烟者状态为 NO,则得分为 5

薪水

如果薪水低于 5 万美元,则得分为 1 如果薪水是 50k-60k 分数是 2 如果薪水是60k-70k分数是3 如果薪水大于 70k 分数为 4

我完全不知道如何编码,我是从这个开始的

CREATE FUNCTION [dbo].[FCupid]
( 
    @gender YES/NO, 
    @name varchar(15), 
    @dob datetime, 
    @weight int, 
    @height int, 
    @smoker Yes/NO, 
    @salary int
)

RETURNS @Member table
AS
BEGIN

    INSERT @Member ( @gender, @name, @dob, @weight, @height, @smoker, @salary)
    SELECT m.gender, m.dob, m.weight, m.height, m.smoker, m.salary,

然后我挣扎。

任何形式的帮助将不胜感激

【问题讨论】:

我认为这是 MS SQL 而不是 mysql 作为标记?还有@gender@smoker 参数的YES/NO 数据类型,这些是bit 数据类型吗? 如果你只传入一组参数,为什么这个函数会返回一个table?这不应该只是将分数返回为INT 吗?? @kev 是的,那是个错误。是的,它们又是位数据类型。 【参考方案1】:

我会创建一个函数,它只返回 score 作为INT,如下所示:

CREATE FUNCTION [dbo].[FCupid]
   (@gender CHAR(1), @name varchar(15), @dob datetime, 
    @weight int, @height int, @smoker BIT, @salary int)
RETURNS INT
AS
BEGIN
    DECLARE @Score INT

    -- determine age in years    
    DECLARE @Age INT
    SELECT @Age = DATEDIFF(YEAR, @dob, GETDATE())

    SELECT 
        @Score = CASE 
                    WHEN @Age BETWEEN 20 AND 30 THEN 5
                    WHEN @Age BETWEEN 31 AND 40 THEN 4
                    WHEN @Age BETWEEN 41 AND 50 THEN 3
                    WHEN @Age > 50 THEN 2
                    ELSE 0
                END

    -- determine weight/height ratio - this should be **DECIMAL**, though - not INT !!      
    DECLARE @WeightHeight INT

    SET @WeightHeight = @Weight / @height

    SET 
       @Score = @Score + 
                CASE 
                  -- what if that ratio is **below** 20 ???
                  WHEN @WeightHeight BETWEEN 20 AND 25 THEN 1
                  WHEN @WeightHeight BETWEEN 25 AND 30 THEN 3
                  WHEN @WeightHeight BETWEEN 30 AND 35 THEN 5
                  WHEN @WeightHeight BETWEEN 35 AND 40 THEN 2
                  ELSE 0  
                END

    -- add five points if non-smoker    
    IF @Smoker = 0
        SET @Score = @Score + 5

    -- determine score by salary    
    SET 
       @Score = @Score + 
                CASE 
                   WHEN @Salary < 50000 THEN 1
                   WHEN @Salary BETWEEN 50001 AND 60000 THEN 2
                   WHEN @Salary BETWEEN 60001 AND 70000 THEN 3
                   WHEN @Salary > 70000 THEN 4
                END


    RETURN @Score
END

这样,您可以使用手头的所有值调用此函数,并让它确定Score,然后您可以根据需要将其插入到表中

另外附带说明:我认为体重和身高应该是DECIMAL(10,2) 或类似的东西 - 而不是INT。您将如何仅使用 INT 来表示 1.86m 的高度? 1?还是2?并且该比率的 CASE 语句还应该处理其值低于 20 或超过 40 的情况——即使在这种情况下它只是使用 0 作为分数(但应该明确定义)。

更新:如果你想往表中插入数据,你可以像这样使用这个函数:

INSERT INTO dbo.YourTable(Name, Gender, DateOfBirth, ...., Score)
   SELECT
       @Name, @Gender, @dob, .....,
       dbo.FCupid(@Gender, @Name, @dob, .........)

所以基本上,您可以在 SELECT 中调用此函数,就好像它是一列(或多或少)

【讨论】:

嘿,谢谢大家的回复,非常有帮助。我只是想知道一旦找到分数并将所有值和分数插入表中,我如何使用此功能?我对此很陌生,谢谢! 有没有办法让这样的输入自动计算分数?插入 Member_Profile(性别、姓名、出生日期、体重、身高、吸烟者、薪水)值(1,'James','19841230',59,185,0,80000),(1,'Jack','19700430', 75, 182, 1, 95000), (1, '詹姆斯', '19670721', 60, 167, 0, 75000);去 @JohnSmith:如果你想使用VALUES(....)方法,你必须在INSERT之前调用函数之前并将返回值存储到变量中跨度>

以上是关于用于计算分数的 UDF - 根据预定义的参数对输入进行评分的主要内容,如果未能解决你的问题,请参考以下文章

使用 Option 作为输入参数定义 Spark scala UDF

在创建表期间调用 UDF

如何将 UDF 的输入参数传递给 sapply

spark自定义UDF为啥参数最多21个

在 BigQuery 中使用 javascript udf 进行 tf idf 计算时,UDF 工作程序在执行期间超时

SQL Server 2008 - UDF 参数类型和返回类型