所以我有以下会员资格历史表
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
答案 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上查看。