Mysql 当使用会话变量时,如何在存储过程中运行此查询
我发现这个查询是正确的 如您所见,它使用Mysql 当使用会话变量时,如何在存储过程中运行此查询,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我发现这个查询是正确的 如您所见,它使用@myvar和@rownum作为会话变量选择IF(@myvar=readdate,@rownum:=@rownum+1,@rownum:=0) 问题是,无法在存储过程内部运行此过程,因为@myvar:=0语法未知,我必须在选择运行时内部引用/设置 您将如何重写上述查询以在存储过程中使用 要测试的样本数据和查询可在 要测试的第二组数据在此使用 SET @myvar := 0; 要在SP内指定值,请执行以下操作: DELIMITER $$ CREATE P
@myvar
和@rownum
作为会话变量选择IF(@myvar=readdate,@rownum:=@rownum+1,@rownum:=0)
问题是,无法在存储过程内部运行此过程,因为@myvar:=0
语法未知,我必须在选择运行时内部引用/设置
您将如何重写上述查询以在存储过程中使用
要测试的样本数据和查询可在要测试的第二组数据在此使用
SET @myvar := 0;
要在SP内指定值,请执行以下操作:
DELIMITER $$
CREATE PROCEDURE prc_median()
BEGIN
SET @myvar:=0;
SET @rownum:=0;
SELECT result.readdate,
AVG(total_gallons) AS total_gallons
FROM (SELECT middle_rows.readdate,
numerated_rows.rownum,
numerated_rows.total_gallons
FROM (SELECT IF(@myvar = readdate, @rownum := @rownum + 1, @rownum := 0) AS rownum,
@myvar := readdate AS readdate_alias,
total_gallons
FROM _temp_total_gallons
ORDER BY readdate,
total_gallons) numerated_rows,
(SELECT readdate,
COUNT(*) / 2 median
FROM _temp_total_gallons
GROUP BY readdate) middle_rows
WHERE numerated_rows.rownum BETWEEN ( middle_rows.median - IF(median = ROUND(median), 1, 0) - 0.5 ) AND ( middle_rows.median - IF(median = ROUND(median), 0, 0.5) )
AND numerated_rows.readdate_alias = middle_rows.readdate) result
GROUP BY readdate;
END;
$$
使用
要在SP内指定值,请执行以下操作:
DELIMITER $$
CREATE PROCEDURE prc_median()
BEGIN
SET @myvar:=0;
SET @rownum:=0;
SELECT result.readdate,
AVG(total_gallons) AS total_gallons
FROM (SELECT middle_rows.readdate,
numerated_rows.rownum,
numerated_rows.total_gallons
FROM (SELECT IF(@myvar = readdate, @rownum := @rownum + 1, @rownum := 0) AS rownum,
@myvar := readdate AS readdate_alias,
total_gallons
FROM _temp_total_gallons
ORDER BY readdate,
total_gallons) numerated_rows,
(SELECT readdate,
COUNT(*) / 2 median
FROM _temp_total_gallons
GROUP BY readdate) middle_rows
WHERE numerated_rows.rownum BETWEEN ( middle_rows.median - IF(median = ROUND(median), 1, 0) - 0.5 ) AND ( middle_rows.median - IF(median = ROUND(median), 0, 0.5) )
AND numerated_rows.readdate_alias = middle_rows.readdate) result
GROUP BY readdate;
END;
$$
我已经尝试过了,当从SP运行此查询(不正确)和手动执行(正确)时,结果不一样。它遗漏了一些行,可能是因为在选择变量中,变量在SP中没有以相同的方式更新。我已经在更新的问题中包含了示例数据导出和查询。@奔腾10:两者都为我返回相同的值:
'2009-04-21',10890.000000'2009-08-25',26300.000000'2009-10-20',3300.000000'2009-10-22',5036.500000'2009-12-01',7837.000000
2009-04-14和2009-04-15为何缺失?我会马上用正确的数据和错误的结果更新要点。@Pentium10:我不知道。正如我所说,两者返回的结果都是一样的。我已经尝试过了,当这个查询从SP运行时(不正确),当我手动执行时(正确),结果不一样。它遗漏了一些行,可能是因为在选择变量中,变量在SP中没有以相同的方式更新。我已经在更新的问题中包含了示例数据导出和查询。@奔腾10:两者都为我返回相同的值:'2009-04-21',10890.000000'2009-08-25',26300.000000'2009-10-20',3300.000000'2009-10-22',5036.500000'2009-12-01',7837.000000
2009-04-14和2009-04-15为何缺失?我会马上用正确的数据和错误的结果更新要点。@Pentium10:我不知道。正如我所说,两者都返回相同的值。它们被称为会话变量。它们被称为会话变量。