Как рандомизировать порядок данных в 3 столбцах - PullRequest
2 голосов
/ 20 августа 2009

У меня есть 3 столбца данных в SQL Server 2005:

LASTNAME ИМЯ ГОРОД

Я хочу случайным образом изменить порядок этих 3 столбцов (и изменить данные), чтобы данные больше не имели значения. Есть простой способ сделать это? Я не хочу изменять какие-либо данные, я просто хочу переупорядочить индекс случайным образом.

Ответы [ 4 ]

2 голосов
/ 20 августа 2009

Когда вы говорите «переупорядочить» эти столбцы, вы имеете в виду, что вы хотите, чтобы некоторые из фамилий оказались в столбце первого имени? Или вы хотите сказать, что некоторые фамилии должны ассоциироваться с другим именем и городом?

Я подозреваю, что вы имеете в виду последнее, и в этом случае вам может быть проще найти программное решение (в отличие от простого решения SQL). Придерживаясь SQL, вы можете сделать что-то вроде:

UPDATE the_table
SET lastname = (SELECT lastname FROM the_table ORDER BY RAND())

В зависимости от того, какую СУБД вы используете, это может работать только для одной строки, может делать все последние имена одинаковыми или может потребовать некоторого изменения синтаксиса для работы вообще, но основной подход - правильный. Конечно, некоторые испытания для копии таблицы являются оправданными, прежде чем испытывать их на реальной вещи.

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

Поскольку вы не хотите изменять исходные данные, вы можете сделать это во временной таблице, заполненной всеми строками.

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

0 голосов
/ 01 октября 2011

В SQL Server 2005+ вы можете подготовить ранжированный набор строк, содержащий три целевых столбца и три дополнительных вычисляемых столбца, заполненных случайным ранжированием (по одному для каждого из трех целевых столбцов). Затем ранжированный набор строк будет соединен с самим собой три раза с использованием столбцов ранжирования, и, наконец, каждый из трех целевых столбцов будет извлечен из своего собственного экземпляра ранжированного набора строк. Вот иллюстрация:

WITH sampledata (FirstName, LastName, CityName) AS (
  SELECT 'John', 'Doe', 'Chicago' UNION ALL
  SELECT 'James', 'Foe', 'Austin' UNION ALL
  SELECT 'Django', 'Fan', 'Portland'
),
ranked AS (
  SELECT
    *,
    FirstNameRank = ROW_NUMBER() OVER (ORDER BY NEWID()),
    LastNameRank  = ROW_NUMBER() OVER (ORDER BY NEWID()),
    CityNameRank  = ROW_NUMBER() OVER (ORDER BY NEWID())
  FROM sampledata
)
SELECT
  fnr.FirstName,
  lnr.LastName,
  cnr.CityName
FROM ranked fnr
  INNER JOIN ranked lnr ON fnr.FirstNameRank = lnr.LastNameRank
  INNER JOIN ranked cnr ON fnr.FirstNameRank = cnr.CityNameRank

Это результат:

FirstName LastName CityName
--------- -------- --------
James     Fan      Chicago
John      Doe      Portland
Django    Foe      Austin
0 голосов
/ 04 сентября 2009

Я предлагаю использовать newid с контрольной суммой для выполнения рандомизации

 SELECT LASTNAME, FIRSTNAME, CITY FROM table ORDER BY CHECKSUM(NEWID())
0 голосов
/ 20 августа 2009
select *, rand() from table order by rand();

Я понимаю, что в некоторых версиях SQL есть rand (), который не меняется для каждой строки. Проверьте на свое. Работает на MySQL.

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