Here is one way (assuming I understand the rules) and with data-in-a-consumable-format goodness:DECLARE @Foo TABLE ( ID INT, Description VARCHAR(50), Value VARCHAR(20), PrimaryKey VARCHAR(20))INSERT @Foo VALUES (1993, 'SpotID', '853780', NULL),(1994, 'SpotAnchor', '0', NULL),(1995, 'SpotCopyAnchor', '0', NULL),(1996, 'SpotDescription', 'Test', NULL),(1997, 'SpotID', '853781', NULL),(1998, 'SpotAnchor', '0', NULL),(1999, 'SpotCopyAnchor', '0', NULL),(2000, 'SpotDescriptionv', 'Test', NULL),(2001, 'SpotID', '853782', NULL),(2002, 'SpotAnchor', '0', NULL),(2003, 'SpotCopyAnchor', '0', NULL),(2004, 'SpotDescription', 'Test', NULL)SELECT *FROM( SELECT A.ID, A.Description, A.Value, CASE WHEN B.Description = 'SpotID' THEN B .Value ELSE NULL END AS PrimaryKey, ROW_NUMBER() OVER (PARTITION BY A.ID ORDER BY B.ID DESC, A.ID DESC) AS RowNum FROM @Foo AS A INNER JOIN @Foo AS B ON B.ID <= A.ID AND B.Description = 'SpotID') AS Temp WHERE RowNum = 1