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()