请考虑以下几点:
CREATE TABLE Members
(
MemberID CHAR(10)
, GroupID CHAR(10)
, JoinDate DATETIME
)
INSERT Members VALUES ('1', 'A', 2010-01-01)
INSERT Members VALUES ('1', 'C', 2010-09-05)
INSERT Members VALUES ('1', 'B', 2010-04-15)
INSERT Members VALUES ('1', 'B', 2010-10-10)
INSERT Members VALUES ('1', 'A', 2010-06-01)
INSERT Members VALUES ('1', 'D', 2001-11-30)从该表中进行选择的最佳方法是什么,确定隐含的"LeaveDate",生成以下数据集:
MemberID GroupID JoinDate LeaveDate
1 A 2010-01-01 2010-04-14
1 B 2010-04-15 2010-05-31
1 A 2010-06-01 2010-09-04
1 C 2010-09-05 2010-10-09
1 B 2010-10-10 2010-11-29
1 D 2010-11-30 NULL正如你所看到的,一个成员被认为在成员资格上没有失效。假设每个成员状态周期的LeaveDate是可以在不同组中为该成员找到的下一个按时间顺序排列的JoinDate的前一天。当然,这是对我的实际问题的简化说明,它包括两个更多的分类/分组列和数千个不同的成员,这些成员的JoinDate值没有特定的顺序存储。
发布于 2011-03-04 23:04:24
也许是这样的东西?自加入,然后选择晚于当前行的加入日期的最小加入日期,即休假日期加1。从上面减去一天。
您可能需要调整特定RDBMS的日期算法。
SELECT
m1.*
, MIN( m2.JoinDate ) - INTERVAL 1 DAY AS LeaveDate
FROM
Members m1
LEFT JOIN
Members m2
ON m2.MemberID = m1.MemberID
AND m2.JoinDate > m1.JoinDate
GROUP BY
m1.MemberID
, m1.GroupID
, m1.JoinDate
ORDER BY
m1.MemberID
, m1.JoinDatehttps://stackoverflow.com/questions/5195263
复制相似问题