我有一个SQL Server表,其中包含大约50,000行.我想随机选择大约5,000行.我想到了一个复杂的方法,创建一个带有"随机数"列的临时表,将我的表复制到其中,循环遍历临时表并用每个行更新RAND()
,然后从该表中选择随机数列< 0.1.我正在寻找一种更简单的方法,如果可能的话,在一个声明中.
本文建议使用该NEWID()
功能.这看起来很有希望,但我看不出如何可靠地选择一定比例的行.
有人曾经这样做过吗?有任何想法吗?
我想知道有没有办法选择100到500之间随机生成的数字以及一个选择查询.
例如: SELECT name, address, random_number FROM users
我不必将此数字存储在db中,只能用于显示目的.
我试过这样的东西,但它无法开始工作..
SELECT name, address, FLOOR(RAND() * 500) AS random_number FROM users
Run Code Online (Sandbox Code Playgroud)
希望有人帮助我.谢谢
我试图产生8:00 AM至8:00 PM之间的随机时间为每一行是从数据集选择的,但是,我总是得到相同的随机值的每一行 -我想这是不同的每一行.
表模式和数据:
?????????????????????????
? ID ? CREATED_DATE ?
?????????????????????????
? ID/1 ? 26/04/2014 ?
? ID/2 ? 26/04/2014 ?
? ID/3 ? 26/04/2014 ?
? ID/4 ? 26/04/2014 ?
? ID/5 ? 26/04/2014 ?
?????????????????????????
Run Code Online (Sandbox Code Playgroud)
СurrentSQL语句:
SELECT [ID]
, MyFunction.dbo.AddWorkDays(14, [CREATED_DATE]) AS [New Date]
, CONVERT(VARCHAR, DATEADD(MILLISECOND, CAST(43200000 * RAND() AS INT), CONVERT(TIME, '08:00')), 114) AS [New Time]
FROM [RandomTable]
Run Code Online (Sandbox Code Playgroud)
当前结果(列中每行的相同时间[New Time]
):
??????????????????????????????????????????
? ID ? …
Run Code Online (Sandbox Code Playgroud) 如何根据所有候选行的应用权重在T-SQL中随机选择一个表行?
例如,我在一个表中有一组行加权为50,25和25(最多加100但不需要),我想随机选择其中一行,其统计结果相当于各自的重量.
我在SQL Server 2005上运行SQL查询,除了从数据库中查询2列之外,我还想随机返回1列随机数.我试过这个:
select column1, column2, floor(rand() * 10000) as column3
from table1
Run Code Online (Sandbox Code Playgroud)
哪种方法有效,但问题是此查询在每一行返回相同的随机数.每次运行查询时它都是一个不同的数字,但它不会因行而异.我怎么能这样做并为每一行获得一个新的随机数?
说我有三个价值观,比尔,史蒂夫,杰克.我想用这些值随机更新一个表,例如
更新联系人设置firstname =('比尔','史蒂夫','杰克')其中city ='NY'
我如何随机化这些值?
谢谢
我正在尝试将预定义值列表中的值随机插入到表中进行测试.我尝试使用此StackOverflow问题中找到的解决方案:
stackoverflow.com/.../update-sql-table-with-random-value-from-other-table
当II尝试这个时,所有插入的"随机"值对于所有3000条记录都是完全相同的.
当我运行实际选择随机行的查询部分时,每次我手动运行时都会选择一个随机记录,所以我知道查询有效.我最好的猜测是发生了什么:
SELECT
某种方式进行优化,不允许对子查询进行多次评估我坚持我的选择.我做错了什么,或者我还有另一种方法吗?
这是我正在使用的代码:
DECLARE @randomStuff TABLE ([id] INT, [val] VARCHAR(100))
INSERT INTO @randomStuff ([id], [val])
VALUES ( 1, 'Test Value 1' )
INSERT INTO @randomStuff ([id], [val])
VALUES ( 2, 'Test Value 2' )
INSERT INTO @randomStuff ([id], [val])
VALUES ( 3, 'Test Value 3' )
INSERT INTO @randomStuff ([id], [val])
VALUES ( 4, 'Test Value 4' )
INSERT INTO @randomStuff ([id], [val])
VALUES ( 5, 'Test Value 5' )
INSERT INTO …
Run Code Online (Sandbox Code Playgroud) 问题
我使用这种技术#Table_1
为 CTE中表中的每一行生成一个随机数。然后我将 CTE 的结果加入到另一个表 上。我不是为 中的每一行获取随机数,而是为连接中的每个结果行获取一个新的随机数!#Table_2
#Table_1
CREATE TABLE #Table_1 (Id INT)
CREATE TABLE #Table_2 (MyId INT, ParentId INT)
INSERT INTO #Table_1
VALUES (1), (2), (3)
INSERT INTO #Table_2
VALUES (1, 1), (2, 1), (3, 1), (4, 1), (1, 2), (2, 2), (3, 2), (1, 3)
;WITH RandomCTE AS
(
SELECT Id, (ABS(CHECKSUM(NewId())) % 5)RandomNumber
FROM #Table_1
)
SELECT r.Id, t.MyId, r.RandomNumber
FROM RandomCTE r
INNER JOIN #Table_2 t
ON r.Id = t.ParentId
Run Code Online (Sandbox Code Playgroud)
结果
Id MyId …
Run Code Online (Sandbox Code Playgroud) 根据这篇文章,在SQL Server中生成随机值的正确方法是:
ABS(CHECKSUM(NewId())) % 14 -- Returns a value between 0 and 13
Run Code Online (Sandbox Code Playgroud)
但是,在case语句中使用此表达式时,例如:
SELECT
CASE ABS(CHECKSUM(NEWID())) % 4
WHEN 0 THEN 'String A'
WHEN 1 THEN 'String B'
WHEN 2 THEN 'String C'
WHEN 3 THEN 'String D'
END AS RandomString -- Returns String A, B, C, D and NULLs.
FROM sys.all_objects
Run Code Online (Sandbox Code Playgroud)
outputtet RandomString列包含一些NULL,可以在这个SQL小提琴中看到.我发现我可以在CTE中包装随机化表达式以避免输出中的NULL,但我仍然想知道为什么上面的代码返回NULL?
WITH RandomNumber AS (
SELECT ABS(CHECKSUM(NEWID())) % 4 AS N FROM sys.all_objects
)
SELECT TOP 100
CASE N
WHEN 0 THEN …
Run Code Online (Sandbox Code Playgroud) 我尝试构建一个适合更大 SELECT 的 CASE 语句。我希望每一行单独解析(每行使用不同的随机数),但在评估特定行中的 case 语句时,随机数是相同的(如果有意义的话)。
我努力了
SELECT
[Player name]
,[Stake]
,[current jackpot]
,CASE
WHEN
rand() < 0.23
THEN
'Win'
WHEN
rand() BETWEEN 0.23 AND 0.89
then
'Lose'
when
rand() >= 0.89
then
'Jackpot'
else
'other'
end as [outcome]
...
Run Code Online (Sandbox Code Playgroud)
但事实上,我有时会得到“其他”结果,这告诉我每个 WHEN 都会创建不同的随机数进行评估。我也无法在开始时声明全局随机数并使用它,因为每一行都应该单独解析。
我需要使用SQL Server生成看似随机的唯一8位数字 ID(可以在前面填充零).这是否有内置功能?我看到了这个 Identity
属性,但它是顺序的,而不是随机的.
如果这是不可能的,那么直接将随机生成的ID写入db然后检查异常是一种好习惯吗?(请注意,我的应用程序是多线程的,因此在写入之前进行检查并不能保证唯一性,除非在原子操作中完成.)
谢谢!
更新:添加"数字"以澄清.编辑表明随机性不需要加密强或任何接近.看似随机就好了.奥利弗提出了一个优雅的解决方案,我已经使用这种方法发布了答案.谢谢,奥利弗!