Find minimum record based on two fields, self joins vs. derived tables
You can use window functions for this:

WITH ct AS
  ( SELECT
        ThingID,
        Attribute1,
        Attribute2,
        Attribute3,
        Rn = ROW_NUMBER() OVER (PARTITION BY ThingID
                                ORDER BY DateID, SequenceID)
    FROM dbo.Fact
  ) 
SELECT
    ThingID,
    Attribute1,
    Attribute2,
    Attribute3
FROM ct
WHERE Rn = 1 ;


and an index on (ThingID, DateID, SequenceID).