0

我想根据时间从数据库中随机选择记录。

例如,我有一个名为 Table1 的表,有数千条记录,现在我想每小时显示大约 100 个问题,但每小时它们应该是随机的。怎么可能达到。

我不想创建一个单独的表,其中包含 100 个列并存储主表的记录 ID,而是我想使用一些逻辑来传递日期和时间,并且在那几个小时内我可以获得 100 个问题。

我正在使用 sqlserver 2005。

如果有人可以帮助我解决这个问题,我将非常感激。

我可以按照以下方式创建带有 id、datetime、string rowno 的新表并保存用逗号分隔的 id 吗?

你认为这有什么问题吗?

4

5 回答 5

0

The way I would attempt this would be:

SELECT TOP 100 [Column_Name]
FROM ...
WHERE [Column_Name] >= DATEADD(hour,-1,GETDATE());
ORDER BY NEWID()

This would get 100 records that were created within the last hour and they will be gathered randomly.

于 2013-08-20T22:49:34.600 回答
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 将它们随机化。

于 2013-08-21T15:25:09.527 回答
0

您无法通过简单的查询来做到这一点。计划一些将成为存储过程的东西。

SQL-SERVER 生成器中的伪随机数生成器使用种子 (tiny-int,int, small-int) 并随机生成 0 到 1 之间的浮点数。希望您的记录有某种数字键。您需要:

(1) 设置一个 WHILE 循环来执行此操作。确保您还使用了合理的计数器变量。增加它并在循环的每次迭代中检查它,因为失控循环并不好玩。

(2) 使用 RAND() 生成浮点数。您可以使用日期和时间中的某些内容作为种子。它必须每次都改变,因为用相同的种子再次调用 RAND(seed) 会给你相同的数字。以下来自 SQL-SERVER 2005 在线书籍:

    SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
        + (DATEPART(ss, GETDATE()) * 1000 )
        + DATEPART(ms, GETDATE()) )

(您可以阅读此内容:在 Transact-SQL 参考中查找 RAND()。那里有一个链接可以告诉您所有相关信息。

(2) 将生成的十进制数乘以十的幂得到一个整数。

(3) 将这些数字存储在某个地方,可能是在表对象或临时表中

(4) 根据存储的表检查新号码,确保它不是重复的(不太可能,但你永远不知道)。出于这个原因,以及防止失控循环,使用大于 100 的计数器限制。如果你确实有一个 dup,生成一个新数字,直到你没有得到一个(另一个 while 循环)不要放任何数字在第二个临时表中,直到您确定他们不是骗子。

(5) 当你的临时表中的记录数达到 100 条时,你应该完成了。您可以只在一个变量中跟踪它,但您可能希望最后将该变量与实际数字进行比较。

(6) 如果您想确保这些数字随着时间的推移是唯一的;即永远不会两次获得相同的记录,只需将临时表中的所有数字插入您保留的一个。在开始之前,您可以从该永久表重新填充临时表。您也可以在一段时间后(一个月、一年等)清除该表。

(7) 当你确定这可行时,将其转换为存储过程。您可能每天都可以将其作为一项工作来运行。

希望这有效。当您完成该存储过程时,为什么不将其发布(带有评论)作为答案,以便每个人都可以看到如何去做。另外,请确保您可以在线访问 MS-SqlServer 书籍的副本;Transact-SQL 参考非常宝贵。

于 2013-08-20T23:41:00.153 回答
0

我通过以下步骤解决了它

我用 id、datetime、string rowno 创建了新表。在 rowno 中,我选择了 100 行的随机数 id 并以逗号分隔的形式保存。

它工作正常。

在上述提出的大多数解决方案中,我认为缺少某些内容,可能是我无法正确询问。

感谢您的所有建议。

于 2013-08-26T13:29:30.480 回答
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为其他一些标准来选择伪随机问题。

于 2013-08-21T10:37:08.760 回答