MSSQL Сортировка продуктов БД Ежедневно - PullRequest
0 голосов
/ 18 октября 2018

У меня есть база данных MSSQL с большим количеством продуктов, которые я хотел бы, по-видимому, рандомизировать их заказ каждый день!

Так что, когда я запрашиваю мою БД, продукты будут выглядеть в рандомизировать порядок, но постоянно для каждого дня недели .

Например: у меня есть 10.000 продуктов определенной категории.Каждый пользователь должен видеть одинаковые товары в этой категории с одинаковым заказом.Топ-20 продуктов должны оставаться неизменными в течение дня для каждого пользователя, который посещает эту категорию.Таким образом, проблема в том, что пользователи не будут прокручивать достаточно, чтобы увидеть последние продукты в этой категории.Поэтому я хотел бы «перетасовывать» продукты по одному в день, чтобы моим постоянным посетителям было показано больше продуктов определенной категории.

Итак, в моей БД я сгенерирую поле, подобное этому:

(ABS(REVERSE(CAST(CAST(Product_id AS VARBINARY) AS INT))) * CAST(DATEPART ( "weekday" , getdate()) as INT)) as [dailysort]
  • Я использую REVERSE, потому что мои идентификаторы продуктов сериализованы, например, 455606371, 455606377, 455606379 и т. Д.
  • Я получаю день недели (1 - 7) и умножаю его на REVERSED product_id
  • Я использую ABS, чтобы убедиться, что мой результат является положительным числом
  • Я заказываю свой запрос по [dailysort]
  • Возможно, я слишком много использую CAST

Так что, переворачивая и умножая, кажется, у меня больше шансов получить уникальный случайный список для каждого дня недели.

Мой вопрос:

  1. Насколько безопасноЭто
  2. Где это может произойти?
  3. Любой лучший подход

Любые предложения будут с благодарностью

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Полагаю, у вас есть столбец Created_date для ваших продуктов.

Я бы использовал это с оператором по модулю или делению вместе с DAY(GETDATE()), чтобы "построить" мой однодневный алгоритм кэширования.

Итак, мой ORDER BY будет выглядеть примерно так:

SELECT
    DAY(CREATED_DATE) / DAY(GETDATE()) [Sorting]
...
ORDER BY Sorting

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

Обновление 1:

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

SELECT
    DAY(CREATED_DATE) % DAY(GETDATE())       [DSorting]
    , MONTH(CREATED_DATE) % MONTH(GETDATE()) [MSorting]
...
ORDER BY DSorting
    , MSorting

Обновление 2:

Однако у вас все еще нет 100% -ного детерминированного подхода с моим предыдущим ответом, поэтому я бы предложил добавить некоторую уникальность в ORDER BY, включив столбец PK (при условии, что он у вас есть), как показано ниже:

SELECT
    DAY(CREATED_DATE) % DAY(GETDATE())       [DSorting]
    , MONTH(CREATED_DATE) % MONTH(GETDATE()) [MSorting]
...
ORDER BY DSorting
    , MSorting
    , ProductID    -- most common PK column name I have ever seen

Обновление 3:

После вашего комментария я думаю, что это будетдостаточно заменить CREATED_DATE на Product_ID, чтобы вы могли получить что-то вроде:

SELECT
    Product_ID % DAY(GETDATE())      [DSorting]
    , Product_ID % MONTH(GETDATE())  [MSorting]
...
ORDER BY DSorting
    , MSorting
    , Product_ID
0 голосов
/ 18 октября 2018

рандомизируйте порядок, но сохраняющийся для каждого дня недели.

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

order by datepart(weekday, getdate()),
         newid()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...