Q:

Select random values from each group, SQL

I have a project through which I'm creating a game powered by a database. 
The database has data entered like this:
(ID, Name) || (1, PhotoID),(1,PhotoID),(1,PhotoID),(2,PhotoID),(2,PhotoID) and so on.  There are thousands of entries. 
This is my current SQL statement:
$sql = "SELECT TOP 8 * FROM Image WHERE Hidden = '0' ORDER BY NEWID()";

But this can also produce results with matching IDs, where I need to have each result have a unique ID (that is I need one result from each group). 
How can I change my query to grab one result from each group? 
Thanks!  

A:

Since ORDER BY NEWID() will result in tablescan anyway, you might use row_number() to isolate first in group:
; with randomizer as (
  select id,
         name,
         row_number() over (partition by id
                            order by newid()) rn
    from Image
   where hidden = 0
)
select top 8
       id,
       name
  from randomizer
 where rn = 1
-- Added by mellamokb's suggestion to allow groups to be randomized
order by newid()

Sql Fiddle playground thanks to mellamokb.