【发布时间】:2021-06-18 16:21:43
【问题描述】:
有没有办法对事件列表进行随机排序并让它只在当天保持这种状态?涉及分页,因此缓存并不是一个好的选择。
我知道我可以通过NEWID() 进行随机排序,但如果它从未被缓存并且在第 1 页包含相同的项目,那将在第 100 页显示不同的顺序。如果是按日期,那么它将显示排序,不管页面缓存,第二天重置。
WITH PagedResults AS
(
SELECT CASE WHEN @SortOrder = 'Name' AND @SortDirection = 'DESC' THEN ROW_NUMBER() OVER (ORDER BY ep.Name DESC, ev.Id ASC)
ELSE ROW_NUMBER() OVER (ORDER BY ev.Id ASC) END AS [Row],
CASE WHEN @SortOrder = 'Name' AND @SortDirection = 'DESC' THEN ROW_NUMBER() OVER (ORDER BY ep.Name ASC, ev.Id DESC)
ELSE ROW_NUMBER() OVER (ORDER BY ev.Id DESC)
END AS [RowReverse],
ev.Id,
ep.Name,
)
SELECT
[Row] + RowReverse - 1 AS Total,
[Row],
[RowReverse],
Id,
Name,
FROM PagedResults
WHERE [Row] BETWEEN (((@Page - 1) * @PageSize) + 1) AND (@Page * @PageSize)
ORDER BY [Row], [RowReverse] DESC
【问题讨论】:
-
您必须生成随机订单,然后将其临时存储在某个地方。我想您可以将随机顺序转换为秒并将其作为缓存形式添加到当前日期时间。
-
您可以生成某种由固定日期部分和随机后缀组成的计算哈希列。这是你要找的吗?
-
如果您使用
RAND()进行随机排序,则可以使用日期作为种子。那么当天的随机数序列将是相同的。不过可能效率不高。 -
如果有人插入或删除一行,你建议发生什么?顺便说一下,我建议你看看Keyset Pagination,它比行集分页效率高得多
-
是否可以在表格中添加额外的列?
标签: sql sql-server random sql-order-by