用于计算分数的 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