每日MSSQL排序数据库产品

时间:2018-10-18 09:38:08

标签: sql sql-server database casting

我有一个包含大量产品的MSSQL数据库,我希望每天按顺序随机分配它们的顺序!

  

因此,当我查询数据库时,产品将按照随机顺序排列   但在每周的每一天都保持不变

     

例如:我有10.000个特定类别的产品。每个用户   应该在同一类别中以相同的顺序看到相同的产品。最佳   对于每个用户而言,一天中20种产品应保持不变   正在访问此类别。所以问题是用户不会   足够滚动以查看此类别中的最后一个产品。所以我会   喜欢每天“洗牌”产品,因此更多的产品   特定类别将显示给我的回访者。

所以在我的数据库中,我生成了一个像这样的字段:

(ABS(REVERSE(CAST(CAST(Product_id AS VARBINARY) AS INT))) * CAST(DATEPART ( "weekday" , getdate()) as INT)) as [dailysort]
  • 我使用REVERSE是因为我的产品ID已序列化,例如455606371, 455606377、455606379 e.t.c
  • 我得到工作日(1-7),然后乘以REVERSED product_id
  • 我使用ABS来确保结果为正数
  • 我按[dailysort]排序查询
  • 可能我过多使用了CAST

因此,通过反转和相乘,我似乎有很大的机会获得一周中每一天的唯一随机列表。

  

我的问题是:

     
      
  1. 这有多安全
  2.   
  3. 这在哪里失败
  4.   
  5. 任何更好的方法
  6.   

任何建议将不胜感激

2 个答案:

答案 0 :(得分:1)

我假设您的产品有一个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%确定性的方法,因此,我建议通过添加PK列(假设您有一个)为ORDER BY添加一些唯一性,如下所示:

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

答案 1 :(得分:0)

  

随机化订单,但在一周的每一天都保持不变。

我不知道这是什么意思。我可以将其解释为“每天内都是随机的,但日子是固定的”。如果是这样,也许有两个键可以满足您的要求:

order by datepart(weekday, getdate()),
         newid()