J'ai une table appelée names
et je veux sélectionner 2 noms après avoir été comptés (*) en tant que uniq, puis 2 autres noms uniquement dans le pool d'échantillons complet.
firstname
John
John
Jessica
Mary
Jessica
John
David
Walter
Donc, les 2 premiers noms seraient choisis dans un groupe de John
, Jessica
, et Mary
etc en leur donnant des chances égales d’être sélectionnées, alors que les deux autres noms seront sélectionnés dans l’ensemble, ce qui rendra un parti pris évident. John
et Jessica
avec plusieurs lignes.
Je suis sûr qu’il ya un moyen de le faire mais je ne peux pas le comprendre. Je veux faire quelque chose comme:
SELECT uniq.firstname
FROM (SELECT firstname, count(*) as count from names GROUP BY firstname) uniq
limit 2
AND
SELECT firstname
FROM (SELECT firstname from names) limit 2
Est-ce possible? Apprécier tous les pointeurs.
Réponses:
0 pour la réponse № 1Je pense que vous êtes proches, mais vous avez besoin d'un peu de hasard pour l'échantillonnage:
(SELECT uniq.firstname
FROM (SELECT firstname, count(*) as count from names GROUP BY firstname) uniq
ORDER BY rand()
limit 2
)
UNION ALL
(SELECT firstname
FROM from names
ORDER BY rand()
limit 2
)
0 pour la réponse № 2
Comme mentionné ici vous pouvez utiliser RAND ou des fonctions similaires pour y parvenir en fonction de la base de données.
MySQL:
SELECT firstname
FROM (SELECT firstname, COUNT(*) as count FROM names GROUP BY firstname)
ORDER BY RAND()
LIMIT 2
PostgreSQL:
SELECT firstname
FROM (SELECT firstname, COUNT(*) as count FROM names GROUP BY firstname)
ORDER BY RANDOM()
LIMIT 2
Microsoft SQL Server:
SELECT TOP 2 firstname
FROM (SELECT firstname, COUNT(*) as count FROM names GROUP BY firstname)
ORDER BY NEWID()
IBM DB2:
SELECT firstname , RAND() as IDX
FROM (SELECT firstname, COUNT(*) as count FROM names GROUP BY firstname)
ORDER BY IDX FETCH FIRST 2 ROWS ONLY
Oracle:
SELECT firstname
FROM(SELECT firstname, COUNT(*) as count FROM names GROUP BY firstname ORDER BY dbms_random.value )
WHERE rownum in (1,2)
Suivez l’approche similaire pour sélectionner dans la piscine entière