为了预先提出这个问题,我想说我之前的编程知识很少,而且我是SQL的初学者。
也就是说,我尝试在MySQL中创建一个函数,根据表中组的百分位数为一系列值分配索引。我已经完成的小组。我在每组中从1到n进行了计数,因此如果组1有100行,则ID从1-100开始,然后对于组2重新开始为1并且增加到组2最大等,直到组10。我试图让我的函数根据这些组计算百分位数,获取表中行等于百分位截止值的指定列的值,然后根据给予函数的值的位置分配索引那些截止点。经过一些研究,我尝试了以下第5组:
DELIMITER |
CREATE
FUNCTION TEST(
ECKS DOUBLE,
INDEX INT) RETURNS INT
BEGIN
DECLARE
indecks INT;
IF ECKS <
(SELECT ECKS
FROM indices table1
WHERE (ID = (ROUND ((
(SELECT MAX(ID) FROM indices table2 WHERE table1.group = 5
) * (20/100)), 0)))
) THEN
SET indecks = 1;
ELSEIF ECKS BETWEEN
(SELECT ECKS
FROM indices table1
WHERE (ID = (ROUND ((
(SELECT MAX(ID) FROM indices table2 WHERE table1.group = 5
) * (20/100)), 0)))
) AND (SELECT ECKS
FROM indices table1
WHERE (ID = (ROUND ((
(SELECT MAX(ID) FROM indices table2 WHERE table1.group = 5
) * (40/100)), 0)))) THEN
SET indecks = 2;
ELSEIF ECKS BETWEEN
(SELECT ECKS
FROM indices table1
WHERE (ID = (ROUND ((
(SELECT MAX(ID) FROM indices table2 WHERE table1.group = 5
) * (40/100)), 0)))
) AND (SELECT ECKS
FROM indices table1
WHERE (ID = (ROUND ((
(SELECT MAX(ID) FROM indices table2 WHERE table1.group = 5
) * (60/100)), 0)))) THEN
SET indecks = 3;
ELSEIF ECKS BETWEEN
(SELECT ECKS
FROM indices table1
WHERE (ID = (ROUND ((
(SELECT MAX(ID) FROM indices table2 WHERE table1.group = 5
) * (60/100)), 0)))
) AND (SELECT ECKS
FROM indices table1
WHERE (ID = (ROUND ((
(SELECT MAX(ID) FROM indices table2 WHERE table1.group = 5
) * (80/100)), 0)))) THEN
SET indecks = 4;
ELSEIF ECKS >
(SELECT ECKS
FROM indices table1
WHERE (ID = (ROUND ((
(SELECT MAX(ID) FROM indices table2 WHERE table1.group = 5
) * (80/100)), 0)))
) THEN
SET indecks = 5;
END IF;
RETURN indecks;
END | DELIMITER ;
嵌套在我从
中获取的IF语句中的SELECT语句的语法http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html
他们自己工作得很好;也就是说,当我将SELECTS作为查询输入时,它们会将我想要输入的值返回到函数中。函数本身运行,但它返回每个非空值作为索引2,每个NULL值作为索引5. NULL值不是问题,但我想知道为什么一切否则正在成为索引2.有人可以告诉我哪里出了问题以及如何解决这个问题吗?谢谢。