我想根据时间随机选择数据库中的记录。
示例 我有一个名为Table1的表有数千条记录,现在每小时我想每小时显示100个问题,但每小时它们应该是随机的。怎么能实现它。
我不想创建一个单独的表,其中100列和存储主表的记录ID,而我想使用一些逻辑,我将通过日期和时间,我可以在那个时间内得到100个问题。
我正在使用sqlserver 2005。
如果有人能帮我解决这个问题,我将非常感激。
我可以按照以下方式进行吗? 使用id,datetime,string rowno创建新表 并保存由逗号分隔的id?
你认为这可能有任何问题吗?
答案 0 :(得分:0)
我尝试这种方式的方式是:
SELECT TOP 100 [Column_Name]
FROM ...
WHERE [Column_Name] >= DATEADD(hour,-1,GETDATE());
ORDER BY NEWID()
这将获得在过去一小时内创建的100条记录,并将随机收集这些记录。
答案 1 :(得分:0)
使用简单查询无法执行此操作。计划将成为存储过程的东西。
SQL-SERVER生成器中的伪随机数生成器使用种子(tiny-int,int,small-int)并随机生成0到1之间的浮点数。希望您有某种数字键你的记录。 你需要:
(1)设置WHILE循环来执行此操作。确保您还使用合理的计数器变量。增加它并在循环的每次迭代中检查它,因为失控的循环并不好玩。
(2)使用RAND()生成浮点数。您可以使用日期和时间中的某些内容作为种子。它必须每次都改变,因为用同一种子再次调用RAND(种子)会给你相同的数字。 以下是SQL-SERVER 2005在线书籍:
SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) )
(您可以阅读:在Transact-SQL参考中查找RAND()。那里有一个链接可以告诉您所有这些。
(2)将十进制数乘以十的幂乘以得到一个整数。
(3)将这些数字存储在某个地方,可能存储在表格对象或临时表格中
(4)根据存储的表检查新号码,确保它不是重复的(不太可能,但你不知道)。出于这个原因,以及对失控循环的保险,使用大于100的计数器限制。如果你有一个重复,生成一个新的数字,直到你没有得到一个(另一个循环)不要放任何数字在第二个临时表中,直到你确定它们不是傻瓜。
(5)当临时表中的记录数达到100时,你应该完成。您可以在变量中对此进行处理,但您可能希望最后根据实际数字检查该变量。
(6)如果你想确保这些数字随着时间的推移是唯一的;即不要两次获得相同的记录,只需将临时表中的所有数字插入到您保留的数字中。您可以在开始之前从该永久表中重新填充临时表。你也可以在一段时间后(一个月,一年,无论如何)清理那张桌子。
(7)当你确定这是有效的时,将其转换为存储过程。你可以每天把它作为一份工作。
希望这有效。当你完成存储过程后,为什么不发布它(带注释)作为答案,这样每个人都可以看到如何做到这一点。此外,请确保您可以在线访问MS-SqlServer Books的副本; Transact-SQL引用非常有用。
答案 2 :(得分:0)
CREATE TABLE CurrentQuestions
(
QuestionId int
)
然后每小时运行一次如下的程序:
CREATE PROCEDURE PopulateCurrentQuestions
AS
BEGIN
DELETE CurrentQuestions
INSERT INTO
CurrentQuestions
SELECT TOP 100
Questions.ID
FROM
Questions
WHERE
ID % DATEPART(hh, GETDATE()) = 0
ORDER BY
NEWID()
END
然后显示这些问题的查询变为:
SELECT
Questions.Title,
Questions.Content,
Questions.WhateverElse
FROM
Questions
INNER JOIN CurrentQuestions ON Questions.ID = CurrentQuestions.QuestionID
然后,您可以随时运行该过程。您还可以将ID % DATEPART(hh, GETDATE()) = 0
更改为其他一些标准,以选择伪随机问题。
答案 3 :(得分:0)
这是一种简单的方法。如果您还没有包含问题的表的标识列,请继续添加一个。
select top 100 *
from Questions Q
where Q.QuestionID % 24 = DATEPART(hour, (CONVERT(datetime, GETDATE())))
order by NEWID()
这将为每个问题分配整数ID。想法是使用基于当前小时的模数。因此,如果它是1.30 AM日期部分将返回1所以所有具有ID(1,25,49,...)的问题将被返回。最后,您只需使用order by随机化它们。
答案 4 :(得分:0)
我通过以下步骤解决了这个问题
我用id,datetime,string rowno创建了新表。 在rowno中,我选择了100行的随机数id,并以COMMA分隔的形式保存。
工作正常。
在上面提到的大部分溶液中,我认为缺少某些东西,我可能无法正确地问它。
感谢你的所有建议。