1

我正在尝试创建一个查询,它将改变我网站上每个用户每次执行的结果。目标是使用 SQL Server 2008 数据库技术实现这一目标。

例如,如果我有一个包含三行数据的表:

我正在尝试找到一种方法来通过名称升序然后移动/旋转结果来选择此数据顺序。

ID  Name 
1   Apple 
2   Orange 
3   Banana

用户 1 加载页面并看到

Apple
Banana
Orange

用户 1 重新加载同一页面,然后看到

Banana
Orange
Apple

用户 1 重新加载同一页面,然后看到

Orange
Apple
Banana

用户 2 等具有完全相同的体验,以相同的顺序旋转/移动结果。

我可以创建和存储任何必要的值,例如名字或姓氏或 ID。

是否有一个简单优雅的解决方案(查询、存储过程、函数等)可以在 SQL Server 级别完成这项任务?

原因是让所有颜色都有机会显示在列表顶部,而不是按字母顺序 A 到 Z。

4

2 回答 2

1

如果 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不能做这项工作。请参阅:SQL Server 的 LIMIT 和 OFFSET 的等效项?

于 2011-10-10T03:51:50.103 回答
0

我不知道 SQL 服务器查询的 shift 或 rotate 输出,但我正在尝试和你一样,我使用 NEWID() 来随机排序我的输出。

select name,company,etc from tblCompany order by NEWID() desc
于 2020-04-25T10:23:03.587 回答