sql - MSSQL 对 DB 产品进行排序 每日
问题描述
我有一个 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 等
- 我得到工作日 (1 - 7) 并将其乘以 REVERSED product_id
- 我使用 ABS 来确保我的结果是正数
- 我通过 [dailysort] 订购我的查询
- 可能我使用 CAST 太多了
因此,通过反转和相乘,我似乎最有可能获得一周中每一天的唯一随机列表。
我的问题是:
- 这有多安全
- 这在哪里会失败
- 任何更好的方法
任何建议将不胜感激
解决方案
我假设您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
推荐阅读
- bash - 将全局命令 gs 的 PATH 从 /usr/bin/gs 更改为 /usr/local/bin/gs
- .htaccess - 在 htaccess 中将子域设置为环境变量
- ios - 将一个 SCNNode 放在一个平面上并检测到该节点被点击
- android - 在视频通话期间制作应用程序需要语音命令
- julia - 如何以良好的性能将字符串数组写入/读取到 .bin
- javascript - 在函数中,如果在大括号中后有代码块,我想知道输出可能是什么
- javascript - 基于双单选按钮选择显示/隐藏输入字段
- uwp - 在 UWP 中为 TextBlock 提供边框
- android - 前台服务被奥利奥杀死
- mobile - 滑动幻灯片的移动问题