Mam stół o nazwie names
, i chcę wybrać 2 nazwy po policzeniu (*) jako uniq, a następnie kolejne 2 nazwy tylko z całej puli próbek.
firstname
John
John
Jessica
Mary
Jessica
John
David
Walter
Tak więc pierwsze 2 nazwy wybiorą z puli John
, Jessica
, i Mary
itp., co daje im równe szanse na wybranie, podczas gdy drugie 2 nazwiska wybiorą z całej puli, więc oczywiste odchylenie zostanie podane John
i Jessica
z wieloma rzędami.
Jestem pewien, że jest na to sposób, ale po prostu nie mogę tego rozgryźć. Chcę zrobić coś takiego
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
czy to możliwe? Doceń wszelkie wskazówki.
Odpowiedzi:
0 dla odpowiedzi № 1Myślę, że jesteś blisko, ale potrzebujesz losowości do próbkowania:
(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 dla odpowiedzi nr 2
Jak wspomniano tutaj możesz użyć RAND lub podobnych funkcji, aby to osiągnąć w zależności od bazy danych.
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
Wyrocznia:
SELECT firstname
FROM(SELECT firstname, COUNT(*) as count FROM names GROUP BY firstname ORDER BY dbms_random.value )
WHERE rownum in (1,2)
Zastosuj podobne podejście do wybierania z całej puli