Ряды без повторяющихся записей - PullRequest
1 голос
/ 03 сентября 2010
id     | name 
-------+------------------------------------- 
209096 | Pharmacy 
204200 | Eyecare Center 
185718 | Duffy PC 
214519 | Shopko 
162225 | Edward Jones 
7609   | Back In Action Chiropractic Center

Я использую select id, name from customer order by random()

Есть 6 записей, и я просто хочу, чтобы при каждом запросе я получал уникальную строку каждый раз шесть раз, а затем она начиналась снова сначала или записи упорядочивались каждый раз, когда верхняя не повторялась

Ответы [ 3 ]

0 голосов
/ 03 сентября 2010

Вы можете использовать эту логику, «миллисекундная» часть текущей даты всегда меняется.У нас есть столбец id как числовой.Таким образом, мы можем использовать модульную функцию для получения случайного порядка:

create table #data(id numeric(10), name varchar(20))
insert #data select 209096 , 'Pharmacy'
insert #data select 204200 , 'Eyecare Center'
insert #data select 185718 , 'Duffy PC'
insert #data select 214519 , 'Shopko'
insert #data select 162225 , 'Edward Jones'
insert #data select 7609   , 'Back In Action Chiropractic Center'

select * from #data order by id % (datepart(ms, getdate()))
0 голосов
/ 03 сентября 2010

ОК. Может быть, есть другой способ сделать это только в SQL. Добавьте новый столбец BIT «выбрано». Определенно не самый быстрый / лучший способ сделать это.

DECLARE @id INT
IF NOT EXISTS (SELECT TOP 1 id FROM customer WHERE selected = 0)
BEGIN
   UPDATE customer SET selected = 0
END

SELECT @id = id FROM
(SELECT TOP 1 id, ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber]
FROM customer WHERE selected = 0
ORDER BY [RandomNumber]) a

UPDATE customer SET selected = 1 WHERE id = @id
SELECT id, name FROM customer WHERE id = @id
0 голосов
/ 03 сентября 2010

Это даст вам 6 случайных строк каждый раз. Группировка по должна обеспечивать уникальные строки, если ваш идентификатор не является уникальным первичным ключом, поэтому, возможно, не нужен - в зависимости от структуры таблицы.

SELECT TOP 6 id, name, ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber]
FROM customer
GROUP BY id,name
ORDER BY [RandomNumber]

Редактировать : Извините! Не правильно прочитал вопрос. Хотя вы можете использовать это для получения случайной строки каждый раз:)

Если вы хотите специально получить все 6 строк в случайном порядке по 1 за раз, вам нужно будет где-то хранить заказ. Предложите создать временную таблицу и выбрать ее там, или, если вы используете интерфейсную веб-страницу, получите все 6 строк и сохраните их в наборе данных.

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