• If you're actually on SQL 2012, you should be able to get better performance by using the LEAD windowed function rather than a self join.

    Both versions produce the same results but note the difference in the execution plans...

    IF OBJECT_ID('tempdb..#Cust', 'U') IS NOT NULL

    DROP TABLE #Cust;

    CREATE TABLE #Cust (

    CustomerID INT,

    CustomerName varchar(16),

    AuditNum int,

    AuditDate date,

    ExpectedDateDifference INT,

    PRIMARY KEY CLUSTERED (CustomerID, AuditNum)

    );

    insert into #Cust(

    CustomerID,

    CustomerName,

    AuditNum,

    AuditDate,

    ExpectedDateDifference

    )

    values

    (11111,'Cust1',1,'2015-10-01',0),

    (11112,'Cust2',1,'2015-10-02',0),

    (11113,'Cust3',1,'2015-10-01',14),

    (11113,'Cust3',2,'2015-09-15',16),

    (11113,'Cust3',3,'2015-08-30',0),

    (11114,'Cust4',1,'2015-10-10',0),

    (11115,'Cust5',1,'2015-09-30',20),

    (11115,'Cust5',2,'2015-09-10',9),

    (11115,'Cust5',3,'2015-09-01',17),

    (11115,'Cust5',4,'2015-08-15',0),

    (11116,'Cust6',1,'2015-11-01',0),

    (11117,'Cust7',1,'2015-10-31',0),

    (11118,'Cust8',1,'2015-09-28',20),

    (11118,'Cust8',2,'2015-09-08',0);

    --select * from @Cust;

    -- Self join approach --

    select

    bd1.CustomerID,

    bd1.CustomerName,

    bd1.AuditNum,

    bd1.AuditDate,

    bd1.ExpectedDateDifference,

    isnull(datediff(day,bd2.AuditDate,bd1.Auditdate),0) DateDifference

    from

    #Cust bd1

    left outer join #Cust bd2

    on (bd1.CustomerID = bd2.CustomerID

    and bd1.AuditNum = bd2.AuditNum -1)

    ;

    -- LEAD function approach --

    select

    bd1.CustomerID,

    bd1.CustomerName,

    bd1.AuditNum,

    bd1.AuditDate,

    bd1.ExpectedDateDifference,

    isnull(datediff(day,LEAD(bd1.AuditDate, 1) OVER (PARTITION BY bd1.CustomerID ORDER BY bd1.AuditNum) ,bd1.Auditdate),0) DateDifference

    from

    #Cust bd1

    ;