Korzystam z MSSQL Server 2005. W mojej bazie danych mam tabelę „customerNames”, która ma dwie kolumny „Id” i „Name” oraz około. 1000 wyników.
Tworzę funkcjonalność, w której za każdym razem muszę losowo wybierać 5 klientów. Czy ktoś może mi powiedzieć, jak utworzyć zapytanie, które otrzyma losowe 5 wierszy (identyfikator i nazwa) za każdym razem, gdy zapytanie zostanie wykonane?
Odpowiedzi:
To powiedziawszy, wydaje się, że wszyscy odwiedzają tę stronę w celu uzyskania bardziej ogólnej odpowiedzi na twoje pytanie:
Wybieranie losowego wiersza w SQL
Wybierz losowy wiersz za pomocą MySQL:
Wybierz losowy wiersz za pomocą PostgreSQL:
Wybierz losowy wiersz za pomocą Microsoft SQL Server:
Wybierz losowy wiersz za pomocą IBM DB2
Wybierz losowy rekord z Oracle:
Wybierz losowy wiersz z sqlite:
źródło
update tbl_vouchers set tbl_UsersID = (select top(1) id from tbl_Users order by NEWID())
- edycja: nie mogę uzyskać formatowania do pracy w komentarzach :(źródło
W przypadku, gdy ktoś chce rozwiązania PostgreSQL:
źródło
Może ta strona będzie pomocna.
Dla tych, którzy nie chcą klikać:
źródło
Jest tutaj fajne rozwiązanie specyficzne dla Microsoft SQL Server 2005. Rozwiązuje problem, w którym pracujesz z dużym zestawem wyników (nie wiem tego pytania).
Losowe wybieranie wierszy z dużej tabeli http://msdn.microsoft.com/en-us/library/cc441928.aspx
źródło
Jeśli masz tabelę z milionami wierszy i zależy Ci na wydajności, może to być lepsza odpowiedź:
https://msdn.microsoft.com/en-us/library/cc441928.aspx
źródło
To stare pytanie, ale próba zastosowania nowego pola (NEWID () lub ORDER BY rand ()) do tabeli z dużą liczbą wierszy byłaby zbyt droga. Jeśli masz przyrostowe, unikalne identyfikatory (i nie masz żadnych otworów), bardziej wydajne będzie obliczenie X # identyfikatorów, które mają zostać wybrane, zamiast stosowania identyfikatora GUID lub podobnego do każdego wiersza, a następnie biorąc górny X #.
Jeśli chcesz wybrać więcej wierszy, przyjrzałbym się zapełnieniu #tempTable identyfikatorem i szeregiem wartości rand (), a następnie użycie każdej wartości rand () do skalowania do wartości min-max. W ten sposób nie musisz definiować wszystkich parametrów @ randomId1 ... n. Podałem przykład poniżej, używając CTE do wypełnienia początkowej tabeli.
źródło
źródło
Przekonałem się, że najlepiej sprawdza się w przypadku dużych zbiorów danych.
TABLESAMPLE(n ROWS) or TABLESAMPLE(n PERCENT)
jest losowy, ale należy dodać,TOP n
aby uzyskać prawidłowy rozmiar próbki.Używanie
NEWID()
jest bardzo wolne na dużych stołach.źródło
Jak wyjaśniłem w tym artykule , aby przetasować zestaw wyników SQL, musisz użyć wywołania funkcji specyficznej dla bazy danych.
Zakładając, że mamy następującą tabelę bazy danych:
I następujące wiersze w
song
tabeli:Wyrocznia
W Oracle należy użyć
DBMS_RANDOM.VALUE
funkcji, jak pokazano w poniższym przykładzie:Podczas uruchamiania wyżej wspomnianego zapytania SQL w Oracle otrzymamy następujący zestaw wyników:
SQL Server
W SQL Server musisz użyć
NEWID
funkcji, jak pokazano w poniższym przykładzie:Podczas uruchamiania wspomnianego zapytania SQL na serwerze SQL Server otrzymamy następujący zestaw wyników:
PostgreSQL
W PostgreSQL musisz użyć
random
funkcji, co ilustruje poniższy przykład:Podczas uruchamiania wyżej wspomnianego zapytania SQL na PostgreSQL otrzymamy następujący zestaw wyników:
MySQL
W MySQL musisz użyć
RAND
funkcji, co ilustruje poniższy przykład:Podczas uruchamiania wyżej wspomnianego zapytania SQL na MySQL otrzymamy następujący zestaw wyników:
źródło
Jeśli używasz dużej tabeli i chcesz uzyskać dostęp do 10 procent danych, uruchom następujące polecenie:
SELECT TOP 10 PERCENT * FROM Table1 ORDER BY NEWID();
źródło