• There are other more sophisticated ways to do this but here is a quickie example given a simple Policy table such as you describe and requiring no dates to work from. Basically it gets the list of all current policy numbers and then for each one of them their direct parent policy. Very simple, but effective. Sample table, data and code:-

    CREATE TABLE policy (

    policyid int identity,

    holderid int not null,

    policyno varchar(10) not null,

    is_current bit not null,

    prevpolicyno varchar(10) )

    GO

    INSERT INTO policy (holderid, policyno, is_current, prevpolicyno) VALUES

    (1,'p1a',1,null),

    (2,'p2a',0,null),

    (2,'p2b',1,'p2a'),

    (3,'p3a',0,null),

    (3,'p3b',0,'p3a'),

    (3,'p3c',0,'p3b'),

    (3,'p3d',1,'p3c'),

    (4,'p4a',1,null)

    GO

    ;WITH curr (policyid, holderid, policyno, is_current, prevpolicyno) AS (

    SELECT policyid, holderid, policyno, is_current, prevpolicyno

    FROM policy

    WHERE is_current = 1)

    SELECT policyid, holderid, policyno, is_current, prevpolicyno

    FROM curr

    UNION

    SELECT p.policyid, p.holderid, p.policyno, p.is_current, p.prevpolicyno

    FROM policy p

    JOIN curr c ON p.policyno = c.prevpolicyno

    GO