If the columns address1, address2, and postcode should be kept together, this may not be a good approach. For example, in the query below, it returns a random combination of street address, city and zip code, which may not be what you want.CREATE TABLE #tmp(surname VARCHAR(32),forename VARCHAR(32), dob date, address1 VARCHAR(255), address2 VARCHAR(255),postcode VARCHAR(255));INSERT INTO #tmp VALUES('Doe','Jane','20010101','234 Washington Ave', 'New York, NY', '10011'),('Doe','Jane','20010101','123 Madison Ave', 'Washington, DC', '20011'),('Doe','Jane','20010101','105 Lincoln Ave', 'San Jose, CA', '95103');SELECT surname, forename,dob, MAX(address1),MAX(address2), MAX(postcode)FROM #tmpGROUP BY surname, forename, dob;An alternative might be to use the row_number() function as follows:SELECT * FROM( SELECT *, ROW_NUMBER() OVER (PARTITION BY surname, forename, dob ORDER BY (SELECT NULL)) AS RN FROM #tmp)sWHERE RN = 1;