• 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