2017-05-04 31 views
0

以下是表格:抱歉,无法在此处正确描述表格。现在我有一张表格,里面有一组数据,我想使用Mysql显示它的特定记录:

Id Date1 Rank1 date2  Rank2 

100 1/1/01 1  1/2/01  1 

100 1/2/01 1  1/3/01  1 

100 1/3/01 1  1/5/01  4 

,我希望看到的结果,其中排名有所变化,但日期1应显示从排名= 1开始的日期, 的输出是这样的:

Id Date1 Rank1  date2 Rank2 

100 1/1/01  1  1/5/01  4 

谁能请让我知道如何去做这件事在MYSQL?我想过使用SQL游标。是否有另一种方式?

+0

请限制问题,一个单一的数据库引擎,除非你想一个对比。一个人的答案很可能不适用于另一个人。 –

回答

1

我将创建一个存储过程和光标通过每个记录进行迭代。

我的存储过程将如下所示:

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; 
0

这是你想要的吗?

SELECT * FROM <table name> 
WHERE Rank1 <> Rank2 
+0

它没有给出“1/1/01”,即等级1的最低日期。输出为:100 1/3/01 1 1/5/01 4.它会返回最后一行。 –

+0

你说你想要“只有等级改变的记录”。好像你还想要别的东西。请充分解释。谢谢。 – Eggsalad

+0

最终我希望看到排名变化的结果,但date1应该显示Rank = 1开始的日期。请参阅我提到的输出。这会帮助我找到“ID”在排列1中的时间长度,然后更改为4,谢谢。 –

0

试试这个嵌套查询

Select Id, (select Date1 from TableName group by Rank1) as Date1, Rank1, Date2, Rank2 from TableName where Rank1<>Rank2;

+0

它运作良好,但不能申请整个数据集..必须使用一些连接,谢谢:) –

相关问题