Лучший способ случайного выбора строк * на * столбец в SQL Server - PullRequest
0 голосов
/ 28 апреля 2010

Поиск SO дает много результатов, описывающих, как выбрать случайные строки данных из таблицы базы данных. Однако мое требование немного иное: я бы хотел выбрать отдельные столбцы из случайных строк наиболее эффективным / случайным / интересным способом.

Чтобы лучше проиллюстрировать: у меня есть большая таблица «Клиенты», и из этого я хотел бы создать несколько вымышленных демо-записей клиентов, которые не являются реальными людьми. Я думаю о том, чтобы просто выполнить произвольный запрос из таблицы «Клиенты», а затем случайным образом связать FirstNames с LastNames, Address, City, State и т. Д.

Так что, если это мои реальные данные клиента (упрощенно):

FirstName  LastName  State  
==========================
Sally      Simpson   SD
Will       Warren    WI    
Mike       Malone    MN
Kelly      Kline     KS

Тогда я бы сгенерировал несколько записей, которые выглядят так:

FirstName  LastName  State  
==========================
Sally      Warren    MN
Kelly      Malone    SD

Etc.

Мой первоначальный подход работает, но ему не хватает элегантности, которую, я надеюсь, даст окончательный ответ. (Я особенно недоволен повторяемостью подзапросов и тем фактом, что это решение требует известного / фиксированного числа полей и поэтому не может использоваться повторно.)

SELECT 
FirstName = (SELECT TOP 1 FirstName FROM Customer ORDER BY newid()),
LastName= (SELECT TOP 1 LastNameFROM Customer ORDER BY newid()),
State = (SELECT TOP 1 State FROM Customer ORDER BY newid())

Спасибо!

Ответы [ 3 ]

3 голосов
/ 28 апреля 2010

ORDER BY NEWID() работает с ROW_NUMBER в SQL Server 2008. Не уверен насчет SQL Server 2005,

Это необходимо для генерации значений для объединения 3-х отдельных запросов: это немного противоречит интуитивному пониманию, потому что вы можете подумать, что всегда будут брать первые 100 строк в другом порядке, но это не так ...

;With F AS
(
  SELECT TOP 100
    FirstName, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Foo
  FROM Customer
), L AS
(
  SELECT TOP 100
    LastName, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Foo
  FROM Customer
), S AS
(
  SELECT TOP 100
    State, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Foo
  FROM Customer
)
SELECT
   F.FirstName, L.LastName, S.State
FROM
   F
   JOIN L ON F.Foo = L.Foo
   JOIN S ON F.Foo = S.Foo
1 голос
/ 28 апреля 2010

Вы можете выбрать сразу N верхних случайных строк (где N = 3 - количество столбцов), а затем взять столбец 1 из строки 1, столбец 2 из строки 2 и т. Д. Я не совсем уверен, как именно сделать этот последний шаг в SQL, но если вы хотите сделать последний шаг на каком-то другом языке, я уверен, что это будет просто.

Кроме того, выбрав N строк одновременно, вы получите новое свойство, которое никогда не будет выбирать два столбца из одной строки (хотя это может вызвать проблемы, если столбцов больше, чем строк).

0 голосов
/ 28 апреля 2010

Мне кажется, что вы на самом деле пытаетесь генерировать случайные данные - тот факт, что у вас уже есть неслучайная связка, на самом деле является лишь побочным примечанием. Если бы я был на вашем месте, я бы посмотрел на генерацию случайных клиентов, выбрав случайные слова из словаря для использования в качестве FName, LName, City и т. Д. В любом случае это кажется более простым и более случайным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...