Mysql:如果另一行上的数据等于当前行上的数据,则为上一行数据

时间:2012-10-19 14:06:23

标签: mysql

所以我有以下会员资格历史表

User_ID  |  Start date  |  End Date  |  Type(0-7) |  
--------------------------------------------------
    2    |   date1      |  date2     |    0       |  
--------------------------------------------------
    2    |   date3      |  date4     |    3       |  
--------------------------------------------------
    2    |   date5      |  date6     |    3       |  
--------------------------------------------------
    2    |   date7      |  date8     |    1       |  
--------------------------------------------------
    3    |   date9      |  date10    |    6       |  
--------------------------------------------------
    3    |   date11     |  date12    |    0       |  
--------------------------------------------------

我正在尝试使用结果创建mysql查询:

    User_ID  |  Start date  |  End Date  |  Type(0-7) |PrevEnd-CurStart| Prevtype    
    ----------------------------------------------------------------------------------
        2    |   date1      |  date2     |    0       |  null OR 0     | null OR 0
    ----------------------------------------------------------------------------------
        2    |   date3      |  date4     |    3       |  Date3-Date2   |  0
    ----------------------------------------------------------------------------------
        2    |   date5      |  date6     |    3       |  Date5-Date4   |  3
    ----------------------------------------------------------------------------------
        2    |   date7      |  date8     |    1       |  Date7-Date6   |  3
    ----------------------------------------------------------------------------------
        3    |   date9      |  date10    |    6       |  null Or 0     |  null OR 0
    ----------------------------------------------------------------------------------
        3    |   date11     |  date12    |    0       |  Date11-Date10 |  6
    ----------------------------------------------------------------------------------

我输入Null或0,因为我可以从

上的那一点开始使用它

我将如何为此编写mysql查询?这只是我需要的报告的子查询,我昨天,昨晚和今天都被困在这一天。真的很感激帮助。运行时间几乎没有相关性,因为我需要每月运行一次。

编辑: 为了得到我当前的输出,我使用以下内容。 'by 1,2,3,4'是因为我需要摆脱很多重复

select 
 mh.account_id, 
 mh.start_date, 
 mh.end_date, 
 mh.`type`
from tbl_membership_history mh join tbl_membership m on mh.account_id=m.account_id
group by 1,2,3,4
order by 1,2,3,4
limit 100

1 个答案:

答案 0 :(得分:2)

您可以使用较早的记录在表上进行自联接,然后聚合以查找最新的早期记录的结束日期(这将给出前一个结束日期)。然后必须将该结果再次加入表中,以便找到前一条记录的Type

SELECT   res.*, prv.Type AS prvType
FROM (
  SELECT   cur.*, MAX(bef.endDate) AS prvEnd
  FROM     history AS cur LEFT JOIN history AS bef
        ON bef.User_ID = cur.User_ID AND bef.endDate <= cur.startDate
  GROUP BY cur.User_ID, cur.startDate, cur.endDate, cur.Type
) res LEFT JOIN history AS prv
        ON prv.User_ID = res.User_ID AND prv.endDate = res.prvEnd

sqlfiddle上查看。