出于广告目的,移动/旋转sql server查询的输出

出于广告目的,移动/旋转sql server查询的输出,sql,sql-server-2008,rotation,shift,Sql,Sql Server 2008,Rotation,Shift,我正在尝试创建一个查询,它将改变我网站上每个用户每次执行的结果。目标是使用SQLServer2008数据库技术实现这一目标 例如,如果我有一个包含三行数据的表: 我试图找到一种方法,通过名称升序,然后移动/旋转结果来选择此数据顺序 ID Name 1 Apple 2 Orange 3 Banana 用户1加载一个页面并看到 Apple Banana Orange 用户1重新加载同一页面,然后看到 Banana Orange Apple Orange Apple Bana

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

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

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

ID  Name 
1   Apple 
2   Orange 
3   Banana
用户1加载一个页面并看到

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

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

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

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

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


原因是,相对于字母顺序A到Z,所有颜色都有机会显示在列表顶部。

如果SQL Server具有序列和类似PostgreSQL或Oracle的
nextval()
函数,那么就可以这么简单-假设您的基本排序基于id,从1开始,没有漏洞:

SELECT id, name
  FROM mytbl
 ORDER BY CASE WHEN id > @nextval%number_of_rows THEN 0 ELSE 1 END, rn
请参见此处了解解决方法:

使用问题的新输入进行编辑 那么它可能是这样的:

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。以上链接可能会有所帮助
为了弄清楚我的语法,我在
上写了一个演示 你可以去那里看看


如果SQL Server具有类似于“限制”和“偏移量”的功能,这将更简单。不能做这项工作。请参阅:

如果SQL Server有序列和一个类似PostgreSQL或Oracle的
nextval()函数,那么就可以这么简单-假设您的基本排序基于id,从1开始,没有漏洞:

SELECT id, name
  FROM mytbl
 ORDER BY CASE WHEN id > @nextval%number_of_rows THEN 0 ELSE 1 END, rn
请参见此处了解解决方法:

使用问题的新输入进行编辑 那么它可能是这样的:

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。以上链接可能会有所帮助
为了弄清楚我的语法,我在
上写了一个演示 你可以去那里看看


如果SQL Server具有类似于“限制”和“偏移量”的功能,这将更简单。不能做这项工作。请参阅:

我不知道SQL server查询的shift或rotate输出,但我正尝试使用与您相同的方法,我使用NEWID()对输出进行随机排序

select name,company,etc from tblCompany order by NEWID() desc

我不知道SQL server查询的shift或rotate输出,但我正在尝试和您一样做,我使用NEWID()对输出进行随机排序

select name,company,etc from tblCompany order by NEWID() desc

行数是常数吗?基本顺序是字母顺序、随机顺序还是id顺序?不,数据是根据类别变化的,至少有一个,可能上限是20行,但通常会少很多,可能是三到五行。行数是恒定的吗?基本的排序是字母顺序、随机顺序还是id顺序?不,数据是根据类别变化的,至少有一个,可能上限是20行,但通常会少很多,可能是三到五个结果。谢谢你的想法。最后,我的例子被简化了。理想情况下,我会按字母顺序对名称进行排序,并进行旋转/移位。我将更新原始问题以表明这一点。对于我来说,我实际上可以为每个用户存储并增加一个数字,以保持他们的位置,在第一次执行时,我将其初始化为0。非常感谢你!谢谢你的主意。最后,我的例子被简化了。理想情况下,我会按字母顺序对名称进行排序,并进行旋转/移位。我将更新原始问题以表明这一点。对于我来说,我实际上可以为每个用户存储并增加一个数字,以保持他们的位置,在第一次执行时,我将其初始化为0。非常感谢你!这个想法很有趣,但当时我需要专门轮换广告,实际上我需要在每个用户的基础上这样做,以确保平等的显示时间。谢谢你在我的第50个星期四再次提出这个问题!干杯这个想法很有趣,但当时我需要专门轮换广告,实际上我需要在每个用户的基础上这样做,以确保平等的显示时间。谢谢你在我的第50个星期四再次提出这个问题!干杯