我将创建一个存储过程和光标通过每个记录进行迭代。
我的存储过程将如下所示:
CREATE PROCEDURE `GetChangedRank`()
BEGIN
# Variables containing the final result
DECLARE ID INTEGER;
DECLARE DATE1 DATE;
DECLARE Rank1 INTEGER;
DECLARE DATE2 DATE;
DECLARE Rank2 INTEGER;
DECLARE ROWNUM INTEGER DEFAULT 0;
# Temporary variables to store values of each row.
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE ID_VALUE INT;
DECLARE DATE1_VALUE DATE;
DECLARE Rank1_VALUE INT;
DECLARE DATE2_VALUE DATE;
DECLARE Rank2_VALUE INT;
# testtable is the table that contains data
DECLARE RECORDS_CURSOR CURSOR FOR SELECT * FROM testtable;
# To check if we reached the end of the result set
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;
# Open cursor
OPEN RECORDS_CURSOR;
# Loop to fetch one row at a time
get_records: LOOP
# Fetch row values to different variables
FETCH RECORDS_CURSOR INTO ID_VALUE, DATE1_VALUE, Rank1_VALUE, DATE2_VALUE, Rank2_VALUE
# To track the row number
SET ROWNUM = ROWNUM + 1;
# Quit the loop when the end of resultset is reached.
IF v_finished = 1 THEN
LEAVE get_records;
END IF;
# Assign the first row values to the final values. Date2 and Rank2 will be updated when the rank is changed.
IF ROWNUM = 1 THEN
BEGIN
SET ID = ID_VALUE;
SET DATE1 = DATE1_VALUE;
SET Rank1 = Rank1_VALUE;
SET DATE2 = DATE2_VALUE;
SET Rank2 = Rank2_VALUE;
END;
ELSE
BEGIN
# Date2 and Rank2 is updated with the row values as the rank is changed.
IF Rank1_VALUE != Rank2_VALUE THEN
BEGIN
SET DATE2 =DATE2_VALUE;
SET Rank2 = Rank2_VALUE;
END;
END IF;
END;
END IF;
END LOOP get_records;
# Select the final values
SELECT ID, DATE1, Rank1, DATE2, Rank2;
# Close cursor
CLOSE RECORDS_CURSOR;
END
一旦程序被创建,您可以运行此程序如下
CALL GetChangedRank;
请限制问题,一个单一的数据库引擎,除非你想一个对比。一个人的答案很可能不适用于另一个人。 –