根据时间从数据库中随机选择“记录”

时间:2013-08-20 22:36:26

标签: sql sql-server asp.net-mvc-3 sql-server-2005

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

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

我不想创建一个单独的表,其中100列和存储主表的记录ID,而我想使用一些逻辑,我将通过日期和时间,我可以在那个时间内得到100个问题。

我正在使用sqlserver 2005。

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

我可以按照以下方式进行吗? 使用id,datetime,string rowno创建新表 并保存由逗号分隔的id?

你认为这可能有任何问题吗?

5 个答案:

答案 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分隔的形式保存。

工作正常。

在上面提到的大部分溶液中,我认为缺少某些东西,我可能无法正确地问它。

感谢你的所有建议。