Group By with inner join
I would not apply formatting directly in the query, but rather at the application layer.

If you really want to, you could do it like this:

WITH CTE
AS
( 
SELECT  p1.name, 
        u1.email,
        ROW_NUMBER() OVER(PARTITION BY Email) as rownum,
        p1.user_id
FROM users as u1 
INNER JOIN purchases as p1 
ON u1.id=p1.user_id  
WHERE u1.email IN (SELECT u.email 
                   FROM users as u 
                   INNER JOIN purchases p 
                   ON u.id=p.user_id 
                   WHERE p.name='Williams Selden') 
)
SELECT
name,
CASE WHEN rownum = 1 THEN email
ELSE ''
END AS email
FROM CTE
ORDER BY user_id;


DB-Fiddle

But I would change the IN to EXISTS, due to how IN handles NULL values (and remove the extra inner join)

WITH CTE
AS
( 
SELECT  p1.name, 
        u1.email,
        ROW_NUMBER() OVER(PARTITION BY Email) as rownum,
        p1.user_id
FROM users as u1 
INNER JOIN purchases as p1 
ON u1.id=p1.user_id  
WHERE EXISTS  (SELECT u1.email 
               FROM  purchases p 
               WHERE u1.id= p.user_id 
               AND p.name='Williams Selden') 
)
SELECT
name,
CASE WHEN rownum = 1 THEN email
ELSE ''
END AS email
FROM CTE
ORDER BY user_id;


DB-Fiddle

Result for both

| name                | email                      |
| ------------------- | -------------------------- |
| Pauletta Arends     | Isabel.Breeding@gmail.com  |
| Miyoko Potter       |                            |
| Wendie Westmoreland |                            |
| Williams Selden     |                            |
| Jettie Dilks        |                            |
| Catina Kiser        |                            |
| Bradly Vasko        |                            |
| Inocencia Cousineau | Ozella.Yoshimura@gmail.com |
| Cammy Bough         |                            |
| Williams Selden     |                            |