I am not sure if an equality check is needed for different fields (e.g. field1 = field2).
Otherwise, this may be sufficient.
Edit
Feel free to customize the test data to provide us with inputs that give the wrong result according to your specifications.
Test Data
DECLARE @Customers TABLE ( customer_number INTEGER IDENTITY(1, 1) , field1 INTEGER , field2 INTEGER , field3 INTEGER , field4 INTEGER) INSERT INTO @Customers SELECT 1, 1, 1, 1 UNION ALL SELECT 1, 1, 1, 1 UNION ALL SELECT 1, 1, 1, NULL UNION ALL SELECT 1, 1, 1, 2 UNION ALL SELECT 1, 1, 1, 3 UNION ALL SELECT 2, 1, 1, 1
Everyone is equal
SELECT ROW_NUMBER() OVER (ORDER BY c1.customer_number) , c1.field1 , c1.field2 , c1.field3 , c1.field4 FROM @Customers c1 INNER JOIN @Customers c2 ON c2.customer_number > c1.customer_number AND ISNULL(c2.field1, 0) = ISNULL(c1.field1, 0) AND ISNULL(c2.field2, 0) = ISNULL(c1.field2, 0) AND ISNULL(c2.field3, 0) = ISNULL(c1.field3, 0) AND ISNULL(c2.field4, 0) = ISNULL(c1.field4, 0)
One field is different
SELECT ROW_NUMBER() OVER (ORDER BY field1, field2, field3, field4) , field1 , field2 , field3 , field4 FROM ( SELECT DISTINCT c1.field1 , c1.field2 , c1.field3 , field4 = NULL FROM @Customers c1 INNER JOIN @Customers c2 ON c2.customer_number > c1.customer_number AND c2.field1 = c1.field1 AND c2.field2 = c1.field2 AND c2.field3 = c1.field3 AND ISNULL(c2.field4, 0) <> ISNULL(c1.field4, 0) UNION ALL SELECT DISTINCT c1.field1 , c1.field2 , NULL , c1.field4 FROM @Customers c1 INNER JOIN @Customers c2 ON c2.customer_number > c1.customer_number AND c2.field1 = c1.field1 AND c2.field2 = c1.field2 AND ISNULL(c2.field3, 0) <> ISNULL(c1.field3, 0) AND c2.field4 = c1.field4 UNION ALL SELECT DISTINCT c1.field1 , NULL , c1.field3 , c1.field4 FROM @Customers c1 INNER JOIN @Customers c2 ON c2.customer_number > c1.customer_number AND c2.field1 = c1.field1 AND ISNULL(c2.field2, 0) <> ISNULL(c1.field2, 0) AND c2.field3 = c1.field3 AND c2.field4 = c1.field4 UNION ALL SELECT DISTINCT NULL , c1.field2 , c1.field3 , c1.field4 FROM @Customers c1 INNER JOIN @Customers c2 ON c2.customer_number > c1.customer_number AND ISNULL(c2.field1, 0) <> ISNULL(c1.field1, 0) AND c2.field2 = c1.field2 AND c2.field3 = c1.field3 AND c2.field4 = c1.field4 ) c