Random record from a database table (T-SQL)

random, sql-server, t-sql

Solution

Is there a succinct way to retrieve a random record from a sql server table?

Yes

SELECT TOP 1 * FROM table ORDER BY NEWID()

Explanation

A `NEWID()` is generated for each row and the table is then sorted by it. The first record is returned (i.e. the record with the "lowest" GUID).

Notes

GUIDs are generated as pseudo-random numbers since version four:

The version 4 UUID is meant for generating UUIDs from truly-random or pseudo-random numbers.

The algorithm is as follows:

- Set the two most significant bits (bits 6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively.

- Set the four most significant bits (bits 12 through 15) of the time_hi_and_version field to the 4-bit version number from Section 4.1.3.

- Set all the other bits to randomly (or pseudo-randomly) chosen values.

—A Universally Unique IDentifier (UUID) URN Namespace - RFC 4122

The alternative `SELECT TOP 1 * FROM table ORDER BY RAND()` will not work as one would think. `RAND()` returns one single value per query, thus all rows will share the same value.

While GUID values are pseudo-random, you will need a better PRNG for the more demanding applications.

Typical performance is less than 10 seconds for around 1,000,000 rows — of course depending on the system. Note that it's impossible to hit an index, thus performance will be relatively limited.

Problem

Is there a succinct way to retrieve a random record from a sql server table? I would like to randomize my unit test data, so am looking for a simple way to select a random id from a table. In English, the select would be "Select one id from the table where the id is a random number between the lowest id in the table and the highest id in the table." I can't figure out a way to do it without have to run the query, test for a null value, then re-run if null. Ideas?

Original source