сдвиг / поворот вывода запроса к серверу sql в рекламных целях - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь создать запрос, который будет сдвигать результаты при каждом выполнении для каждого пользователя на моем сайте. Цель для достижения этой цели с использованием технологии баз данных SQL Server 2008.

Например, если у меня есть таблица с тремя строками данных:

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

ID  Name 
1   Apple 
2   Orange 
3   Banana

Пользователь 1 загружает страницу и видит

Apple
Banana
Orange

Пользователь 1 перезагружает ту же страницу и видит

Banana
Orange
Apple

Пользователь 1 перезагружает ту же страницу и видит

Orange
Apple
Banana

Пользователь 2 и т. Д. Имеют точно такой же опыт, вращая / сдвигая результаты в том же порядке.

Я могу создавать и хранить любые необходимые значения, такие как имя или фамилия или идентификатор.

Существует ли простое элегантное решение (запрос, хранимая процедура, функция и т. Д.), Которое выполнит эту задачу на уровне SQL Server?

Причина в том, что все цвета имеют возможность отображаться в верхней части списка по сравнению с алфавитным порядком от А до Я.

1 Ответ

1 голос
/ 10 октября 2011

Если бы SQL Server имел последовательности и функцию nextval(), такую ​​как PostgreSQL или Oracle, это могло бы быть так просто - учитывая, что ваша базовая сортировка была по id, начиная с 1, без дырок:

SELECT id, name
  FROM mytbl
 ORDER BY CASE WHEN id > @nextval%number_of_rows THEN 0 ELSE 1 END, rn

Смотрите здесь для обходных путей: последовательность Oracle, но затем в MS SQL Server .

Редактирование с новым вводом из вопроса

Тогда это может выглядеть так:

DECLARE @nextval int;

WITH x AS
(
SELECT id
      ,name
      ,ROW_NUMBER() OVER(ORDER BY name) AS rn
      ,COUNT(*) OVER() AS ct
  FROM mytbl 
)
SELECT id
      ,name
  FROM x
 ORDER BY CASE WHEN rn > @nextval%ct THEN 0 ELSE 1 END, rn
  • Сортировка по алфавиту.
  • Число строк динамическое.
  • Синтаксис проверен сейчас
  • Вам нужен только способ увеличения @nextval.Приведенная выше ссылка может помочь.

Чтобы понять мой синтаксис, я написал демо на data.stackexchange.com
Вы можете пойти тудаи проверьте это!

Это было бы проще, если бы в SQL Server было что-то вроде LIMIT и OFFSET.TOP не может выполнить работу.См .: Эквивалент LIMIT и OFFSET для SQL Server?

...