Mysql:如果另一行上的数据等于当前行上的数据,则为上一行数据
所以我有下面的会员历史记录表Mysql:如果另一行上的数据等于当前行上的数据,则为上一行数据,mysql,Mysql,所以我有下面的会员历史记录表 User_ID | Start date | End Date | Type(0-7) | -------------------------------------------------- 2 | date1 | date2 | 0 | -------------------------------------------------- 2 | date3 |
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查询呢?这只是我需要的一份报告的子查询,我昨天、昨天晚上和今天整天都在做这个。非常感谢你的帮助。运行时间没有什么相关性,因为我每月只需要运行一次
编辑:
要获得当前输出,我使用以下命令。“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
您可以在表上与较早的记录进行自联接,然后进行聚合以查找这些较早记录的最新结束日期,该日期给出了以前的结束日期。然后必须再将该结果与表联接一次,以查找上一条记录的类型:
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
看吧。先生,你真是个天才!我选择了一个离线的周末,但我只是运行它!太神了非常感谢。