sql server 2008 - SQL - need to determine implicit end dates for supplied begin dates -


consider 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 best way select table, determining implied "leavedate", producing following data set:

memberid groupid joindate    leavedate 1              2010-01-01  2010-04-14 1        b       2010-04-15  2010-05-31 1              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 can see, member assumed have no lapse in membership. [leavedate] each member status period assumed day prior next chronological [joindate] can found member in different group. of course simplified illustration of actual problem, includes couple more categorization/grouping columns , thousands of different members [joindate] values stored in no particular order.

something perhaps? self join, , select minimum joining date greater joining date current row - i.e. leave date plus one. subtract 1 day it.

you may need adjust date arithmetic particular rdbms.

select       m1.*     , min( m2.joindate ) - interval 1 day leavedate     members m1 left join     members m2 on    m2.memberid = m1.memberid ,   m2.joindate > m1.joindate group       m1.memberid     , m1.groupid     , m1.joindate order       m1.memberid     , m1.joindate 

Comments

Popular posts from this blog

c# - How to set Z index when using WPF DrawingContext? -

razor - Is this a bug in WebMatrix PageData? -

android - layout with fragment and framelayout replaced by another fragment and framelayout -