2013-08-20 56 views
0

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

示例 我有名字Table1有表有千个记录,现在每小时我想每小时显示100个问题,但每小时他们应该是随机的。如何实现它。

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

我使用SQLSERVER 2005

我会非常心存感激,如果任何人能帮助我解决这个问题。

我可以按照以下方法做 用ID,日期时间,字符串rowno 创建新表并保存由逗号分隔的ID吗?

你认为在这可以有任何问题??

+0

嗨, 我能做到这一点下面的方式 创建一个ID,日期时间,串新表rowno 和保存用逗号分隔的ID? 你认为在这可以有任何问题? – javadotnetcoder

回答

0

我会尝试,这将是这样:

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

这将获得最后的一小时内被创造,他们会随机收集的是100条记录。

+0

我不认为他想要在最近一小时创建的行,但随机行的列表是静态的一个小时。 –

+0

那么如果可能的话,您可以编写一个控制台应用程序,它每小时运行一次查询,并将结果存储在后端代码中,并将信息显示在需要通过后端存储的位置。这可以确保您的结果在任何时候都保持静态。不确定你在哪里或者在哪里显示你的信息,但这在过去的项目中对我来说很有用。 – Rafa

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())) 

(您可以在此阅读起来:寻找RAND()的Transact-SQL参考有一个环节出现,将告诉你一切。此。

(2)乘以生成十进制数十倍的一些功率,以便获得一个整数。

(3)存储这些号码某处,也许在表对象或一个临时表

( 4)根据商店检查新号码d表格以确保它不是一个dup(不太可能,但你永远不知道)。出于这个原因,以及针对失控循环的保险,请使用大于100的计数器限制。如果您确实有重复数据,请生成一个新的数字,直到您没有获得一个(另一个while循环)为止。请勿将任何数字在第二个临时表中,直到你确定他们不是愚蠢的。

(5)当临时表中的记录数达到100时,应该完成。你可以简单地把它放在一个变量中,但你可能想在最后检查这个变量与实际的数字。

(6)如果你想确保这些数字在一段时间内是唯一的,永远不要获得相同的记录两次,只需将临时表中的所有数字插入到您保存的记录中。在开始之前,您可以从该永久性表中重新填充临时表。你也可以在一段时间后(一个月,一年,无论如何)清除那张桌子。

(7)当你确定这个工作正常时,把它转换成存储过程。你可能每天都可以把它作为一项工作来运行。

希望这个工程。当你完成存储过程时,为什么不把它发布(包括评论)作为答案,这样每个人都可以看到如何去做。此外,请确保您可以在线访问MS-SqlServer图书的副本; Transact-SQL参考是无价的。

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更改为其他一些标准来选择伪随机问题。

+0

嗨Tobsey,在你的逻辑中有2个问题,首先你没有选择随机记录,第二你删除它们,所以万一我想重新回到他们,我该怎么做呢? – javadotnetcoder

0

这是一个简单的方法来做到这一点。如果您尚未拥有问题表的标识列,请继续并添加一个问题。

select top 100 * 
from Questions Q 
where Q.QuestionID % 24 = DATEPART(hour, (CONVERT(datetime, GETDATE()))) 
order by NEWID() 

这将为每个问题分配整数ID。想法是使用基于当前小时的模量。因此,如果是上午1点半,则日期部分将返回1,因此所有具有类似(1,25,49,...)ID的问题都将返回。最后,您只需使用order by来随机化它们。

0

我用下面的步骤解决了它

我用id,datetime,string rowno创建了新表。 在rowno中,我选择了100行的随机数字ID并将其保存为COMMA分隔形式。

它工作正常。

在上面提到的大多数soln中,我认为缺少某些东西,可能有可能我无法正确地提出问题。

感谢您的所有建议。