0

所以我有以下会员历史表

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 查询?这只是我需要的报告的子查询,昨天,昨晚和今天,我整天都被困在上面。非常感谢您的帮助。运行时间无关紧要,因为我每月只需要运行一次。

编辑:要获得我当前的输出,我使用以下内容。'group 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
4

1 回答 1

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上查看。

于 2012-10-19T14:41:43.280 回答