Table d'échantillons SQL random avec duplicates

En supposant que j'ai le tableau suivant:

unitid | transtatus | currency --------------------------------------- 1024393230 | not_started | GBp - Pence 1024397398 | in_progress | GBp - Pence 1024397398 | not_started | USd - Cent 1024397408 | not_started | GBp - Pence 1024397408 | not_started | EUR 1024401371 | not_started | GBp - Pence 1024403375 | in_progress | GBp - Pence 

Je veux sélectionner des rangées randoms pour QC Je peux le faire par

 select top 3 tbble.unitid,tbble.transtatus, tbble.currency from tbble order by newid() 

Cependant puisque certaines lignes partagent le même unitid (et si c'est le cas) je veux tirer toutes les lignes associées à cet unitid

Donc, la requête returnnera: (dans le cas où les lignes randoms n'ont qu'une seule ligne pour cet unitid)

  unitid | transtatus | currency --------------------------------------- 1024393230 | not_started | GBp - Pence 1024401371 | not_started | GBp - Pence 1024403375 | in_progress | GBp - Pence 

ou: (dans le cas de deux lignes associées à cet unitid)

  1024397398 | in_progress | GBp - Pence 1024397398 | not_started | USd - Cent 1024401371 | not_started | GBp - Pence 1024403375 | in_progress | GBp - Pence 

Pas vraiment sûr de comment je peux y arriver. Peut-être countr le nombre d'apparitions unitid en premier et ensuite si le count est supérieur à 1 puis les append à l'échantillon random initial?

Je pense que ceci accomplit ce que vous voulez, qui est trois identifiants unitaires randoms et toutes leurs rangées:

 select t.* from tbble t join (select top 3 t.unitid from (select distinct t.unitid from tbble t) t order by newid() ) tt on t.unitid = tt.unitid 

Peut-être que vous pourriez utiliser une sous-requête pour travailler en deux étapes: d'abord vous select un unitid random avec la sous-requête, puis pour chacune d'entre elles, vous select les lignes entières de votre table avec le même unitid . Ça devrait ressembler à ça :

 select tbble.unitid, tbble.transtatus, tbble.currency from tbble where tbble.unitid in (select top 3 tbble.unitid as randomunitid from tbble order by newid()) 

Vous devez utiliser la clause WITH TIES pour get des lignes correspondantes

 select top 3 WITH TIES * tbble.unitid,tbble.transtatus, tbble.currency from tbble order by newid()