declare @max int , @cnt intdeclare @t table (id int ,Company varchar(50),Site nvarchar(20),TransDate Datetime) set @cnt =1 --select * from #TransDetailselect @max = MAX(Number) from #TransDetailwhile ( @max > = @cnt) begin insert into @t select @cnt, 'COMP','MyCompany','2012-12-01 00:00:00' insert into @t select @cnt, 'COMPUSA','MyNewCompany','2012-12-02 00:00:00' set @cnt = @cnt + 1 end select a.*from #TransDetail b right join @t aon a.id = b.number and a.Company = b.Companywhere b.number is null
;WITH MassagedData AS ( SELECT Company, MIN_Number = MIN(Number), MAX_Number = MAX(Number), rn = ROW_NUMBER() OVER(PARTITION BY Company ORDER BY MIN(Number)) FROM ( SELECT Company, Number, gp = Number - ROW_NUMBER() OVER(PARTITION BY Company ORDER BY Number) FROM #TransDetail ) d GROUP BY Company, gp)SELECT a.Company, PriorNumber = a.MAX_Number, NextNumber = b.MIN_NumberINTO #RangeBoundariesFROM MassagedData aINNER JOIN MassagedData b ON b.Company = a.Company AND b.rn = a.rn + 1SELECT r.Company, p.[Site], r.PriorNumber, PriorDate = p.TransDate, PriorTime = p.TransTime, r.NextNumber, NextDate = n.TransDate, NextTime = n.TransTime FROM #RangeBoundaries rLEFT JOIN #TransDetail p ON p.Company = r.Company AND p.Number = r.PriorNumberLEFT JOIN #TransDetail n ON n.Company = r.Company AND n.Number = r.NextNumberORDER BY r.Company, r.PriorNumber
;WITH Tally (n) AS ( SELECT TOP (SELECT MAX(Number) FROM #TransDetail) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM sys.all_columns), IntialGrouping AS ( SELECT Site, Company, TransDate, TransTime, StartNumber=MIN(Number), EndNumber=MAX(Number) FROM ( SELECT ID, Number, TransDate, TransTime, Site, Company ,rn=Number-ROW_NUMBER() OVER (PARTITION BY TransDate, Site, Company ORDER BY Number) FROM #TransDetail) a GROUP BY TransDate,TransTime,Site,Company,rn)SELECT Site, Company, TransDate, TransTime, Number=nFROM ( SELECT Site, Company, TransDate, TransTime, StartNumber=MIN(Number), EndNumber=MAX(Number) FROM ( SELECT Site, Company, TransDate, TransTime, Number, rn FROM ( SELECT Site, Company, TransDate, TransTime, Number ,rn=ROW_NUMBER() OVER (PARTITION BY TransDate, Site, Company ORDER BY Number)/2 FROM IntialGrouping a CROSS APPLY (VALUES (StartNumber-1),(EndNumber+1)) b(Number) ) a ) a GROUP BY Site, Company, TransDate, TransTime, rn HAVING COUNT(*) = 2) aCROSS APPLY (SELECT n FROM Tally WHERE n BETWEEN StartNumber AND EndNumber) b;