• I cleaned up your sample data and came up with a not so optimal solution . This can be greatly improved by removing the need for the DISTINCT clause. Using MAX with and OVER clause is also not a great practice. All that said, here's my solution:

    USE Tempdb

    GO

    IF OBJECT_ID('tempdb..HISTORY') IS NOT NULL DROP TABLE HISTORY;

    CREATE TABLE HISTORY

    (

    CUSTOMER VARCHAR(10),

    PLANNBR VARCHAR(10),

    SUBPLAN VARCHAR(3),

    STARTDATE DATE,

    ENDDATE DATE,

    HISTORYMONTH VARCHAR(6));

    GO

    INSERT INTO HISTORY(CUSTOMER, PLANNBR, SUBPLAN, STARTDATE, ENDDATE, HISTORYMONTH)

    VALUES

    ('9111111', 'H1111LAC', '006', '2014-01-01', '2014-05-31', '201401')

    ,('9111111','H1111LAC', '006', '2014-01-01', '2014-05-31', '201402')

    ,('9111111','H1111LAC', '006', '2014-01-01', '2014-05-31', '201403')

    ,('9111111','H1111LAC', '006', '2014-01-01', '2014-05-31', '201404')

    ,('9111111','H1111LAC', '006', '2014-01-01', '2014-05-31', '201405')

    ,('9111111','H1111OC', '010', '06-01-2014', '2999-12-31', '201406')

    ,('9111112', 'H1111LAC', '006', '2014-01-01', '2014-05-31', '201401')

    ,('9111112','H1111LAC', '006', '2014-01-01', '2014-05-31', '201402')

    ,('9111112','H1111LAC', '006', '2014-01-01', '2014-05-31', '201403')

    ,('9111112','H1111LAC', '006', '2014-01-01', '2014-05-31', '201404')

    ,('9111112','H1111LAC', '006', '2014-01-01', '2014-05-31', '201405')

    ,('9111112','H1111LAC', '018', '06-01-2014', '2999-12-31', '201406')

    ,('9111113', 'H1111LAC', '006', '2014-01-01', '2999-12-31', '201401')

    ,('9111113','H1111LAC', '006', '2014-01-01', '2999-12-31', '201402')

    ,('9111113','H1111LAC', '006', '2014-01-01', '2999-12-31', '201403')

    ,('9111113','H1111LAC', '006', '2014-01-01', '2999-12-31', '201404')

    ,('9111113','H1111LAC', '006', '2014-01-01', '2999-12-31', '201405')

    ,('9111113','H1111LAC', '006', '2014-01-01', '2999-12-31', '201406')

    ,('9111114','H1111LAC', '006', '2014-01-01', '2014-02-28', '201402')

    ,('9111114','H1111LAC', '006', '2014-04-01', '2999-12-31', '201404');

    -- THIS IS WHAT YOU NEED:

    WITH cte_History (CUSTOMER, PLANNBR, SUBPLAN, STARTDATE, ENDDATE)

    AS

    (

    SELECT 9111111, 'H1111LAC','006', '2014-01-01', '2014-05-31' UNION ALL

    SELECT 9111111, 'H1111OC','010', '2014-06-01', '2999-12-31' UNION ALL

    SELECT 9111112, 'H1111LAC','006', '2014-01-01', '2014-05-31' UNION ALL

    SELECT 9111112, 'H1111LAC','018', '2014-06-01', '2999-12-31' UNION ALL

    SELECT 9111113, 'H1111LAC','006', '2014-01-01', '2999-12-31' UNION ALL

    SELECT 9111114, 'H1111LAC','006', '2014-01-01', '2014-02-28' UNION ALL

    SELECT 9111114, 'H1111LAC','006', '2014-04-01', '2999-12-31'

    )

    SELECT * FROM cte_history;

    -- My not-so-optimal solution

    WITH base AS

    (

    SELECTCUSTOMER,

    PLANNBR,

    SUBPLAN,

    STARTDATE

    FROM HISTORY

    GROUP BY CUSTOMER, PLANNBR, SUBPLAN, STARTDATE

    )

    SELECT DISTINCT b.*, MAX(ENDDATE) OVER (PARTITION BY b.CUSTOMER, b.PLANNBR, b.SUBPLAN, b.STARTDATE)

    FROM base b

    CROSS APPLY HISTORY h

    WHERE h.CUSTOMER = b.CUSTOMER

    AND h.PLANNBR = b.PLANNBR

    AND h.SUBPLAN = b.SUBPLAN

    AND h.STARTDATE = b.STARTDATE;

    Edit: code formatting.

    "I cant stress enough the importance of switching from a sequential files mindset to set-based thinking. After you make the switch, you can spend your time tuning and optimizing your queries instead of maintaining lengthy, poor-performing code."

    -- Itzik Ben-Gan 2001