Without something to test this against and using Dwain's tip on the row_number, the following may do what you want
;WITH NewIDAllRecords AS (
SELECT
jobDB.num AS JobNumber,
DateAdd(minute, 570, jobDB.entered) AS CreatedDate,
DateAdd(minute, 570, jobDB.closed) AS ClosedDate,
person.uniqueId AS UserID,
NEWID() AS Random
FROM jobDB
LEFT OUTER JOIN person ON jobDB.contactId=person.personID
WHERE jobDB.status=N'Closed'
AND DateAdd(minute, 570, jobDB.entered) >= DATEADD(d, -28, GETDATE())
AND DateAdd(minute, 570, jobDB.closed) >= DATEADD(d, -7, GETDATE())
AND person.uniqueId IS NOT NULL
),
SequenceAllUserRecords AS (
SELECT
ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY Random) AS Seq,
JobNumber, CreatedDate, ClosedDate, UserID, Random
FROM NewIDAllRecords
)
SELECT TOP 50
JobNumber, CreatedDate, ClosedDate, UserID
FROM SequenceAllUserRecords
WHERE Seq = 1
ORDER BY Random