【问题标题】:Get randomically or row from a table从表中随机获取或行
【发布时间】:2014-10-04 08:30:14
【问题描述】:

我需要你帮助...解决一个小问题。 我有一个应该在表中访问的 java 服务并从表中获取随机行

我的表很简单:它只包含两个列:

"Id"        INT IDENTITY(1,1) NOT NULL Primary Key
"Datas"     Varchar(64)       NOT NULL

Id 是一个累进数字,因此您应该认为创建一个随机数并获取 id=randomic_number 所在的行就足够了。

但是我在桌子上有很多空白。例如,一个表格样本可能是这样的:

  ID    Datas
  1     Row1
  2     Row2
  3     Row3
  8     Row4
 10     Row5
 25     Row6
639     Row7

有没有一种非常时尚的方式来随机获得一排?没有条件必须是......只是随机的! 我使用 sql srv 2000。

我会避免...

select *

然后使用随机数循环整个结果集...因为它可以包含大量行...

【问题讨论】:

  • 您使用的是什么数据库?我假设是 MSSQL(由于 IDENTITY 关键字)?
  • 好的。感谢您的澄清。我添加了tsql 标签来反映这一点。
  • EXHUMA!!!极好的!!! SELECT TOP 1 column from table ORDER BY NEWID() 非常感谢!!!

标签: sql tsql random


【解决方案1】:

我建议像这样获取表中的最后一个 id

SELECT TOP 1 Id FROM table_name ORDER BY Id DESC

然后假设它存储在maxId 变量中,您可以在1maxId 之间生成一个随机数index 并执行以下操作:

SELECT TOP 1 * FROM table_name WHERE Id > index

就是这样

【讨论】:

  • 如果我的差距很大,那根本不是随机的。例如:我有以下 ID:1,2,3,650,651,652 等... 4 和 649 之间的随机数...将始终返回同一行(n° 650)...
【解决方案2】:

你应该能够按照以下方式做一些事情:

SELECT TOP 1 * FROM mytable ORDER BY newid()

注意:这是#52964 的副本,而#19412 又是#19412 的副本

【讨论】:

  • 在 SQL 中,rand 函数将为语句生成一个随机值,并将该值应用于返回的每一行。
  • 很好的答案,我刚刚在 PostgreSQL 上尝试过,它可以工作。使用数据库返回随机行是最好的选择,因为在客户端的 java 中这样做不会那么优雅或高效
  • @PhilipKelley checksum 如何进一步随机化这个?据我所知,checksum 是一个 -- ducks -- 散列函数(即确定性)。所以相同的 ID 总是会返回相同的结果。我看不出这对随机化有何帮助。
  • 确实TABLESAMPLE 不是完全随机的,因为选择的单位是页而不是行。但是,如果您的数据量很大,那么权衡是必要的。可以将 TABLESAMPLE 与 top(1) ... order by newid() 结合起来以获得“相当随机”,而无需支付大数据扫描的代价。如果桌子很小,那么为什么要打扰,确实...
  • @PhilipKelley newid() guid 没有任何“顺序性”。出于所有目的,裸加密,它们是随机的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 2015-02-15
  • 2023-03-11
  • 2015-09-22
  • 2012-09-03
相关资源
最近更新 更多