/ / SQL: sélectionne dans la même table et la même colonne, avec des comptes différents - sql

SQL: sélectionnez dans la même table et la même colonne, juste des comptes différents - sql

J'ai une table appelée nameset 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 № 1

Je 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