开发者

SQL - need to determine implicit end dates for supplied begin dates

Consider the following:

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)

What would be the best way to select from this table, determining the implied "LeaveDate", producing the following data set:

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

As you can see, a member is assumed to have no lapse in membership. The [LeaveDate] for each member status period is assumed to be the day prior to the next chronological [JoinDate] that can be found for that member in a different group. Of course this is a simplified illustration of my actual pro开发者_Python百科blem, which includes a couple more categorization/grouping columns and thousands of different members with [JoinDate] values stored in no particular order.


Something like this perhaps? Self join, and select the minimum joining date that is greater than the joining date for the current row - i.e. the leave date plus one. Subtract one day from it.

You may need to adjust the date arithmetic for your particular 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.JoinDate


Standard (ANSI) SQL solution:

SELECT memberid,
       groupid,
       joindate,
       lead(joindate) OVER (PARTITION BY memberid ORDER BY joindate ASC) AS leave_date
FROM members
ORDER BY joindate ASC
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜