Sql 基于键的随机选择查询

Sql 基于键的随机选择查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,是否可以根据关键点随机选择 我使用此查询随机查询: SELECT * FROM tbl_news ORDER BY NEWID(); 是否有这样的函数或方法来基于键进行随机查询: 使用相同的键: 使用另一个键: 你想要的是所谓的随机种子。看见种子使随机数可重复。我认为解决方法是使用seed并将它们放入一个表中,然后将这个表与您的表连接起来,以找到您想要的列表。请参见下面的示例 DECLARE @SEED INT = 100; DECLARE @SIZE INT = 5; -- url http

是否可以根据关键点随机选择

我使用此查询随机查询:

SELECT * FROM tbl_news ORDER BY NEWID();
是否有这样的函数或方法来基于键进行随机查询:

使用相同的键:

使用另一个键:


你想要的是所谓的随机种子。看见种子使随机数可重复。我认为解决方法是使用seed并将它们放入一个表中,然后将这个表与您的表连接起来,以找到您想要的列表。请参见下面的示例

DECLARE @SEED INT = 100;
DECLARE @SIZE INT = 5;
-- url http://www.codeproject.com/Tips/811913/Generating-a-set-of-random-numbers-in-SQL-Server
WITH RandomNumbers (RowNumber, RandomNumber) AS (
    -- Anchor member definition
    SELECT  1                         AS RowNumber, 
            RAND(@SEED) AS RandomNumber
    UNION ALL
    -- Recursive member definition
    SELECT  rn.RowNumber + 1          AS RowNumber, 
            RAND( 1000000000* RAND(@SEED + rn.RowNumber))  AS RandomNumber
    FROM RandomNumbers rn
    WHERE rn.RowNumber < @SIZE
)
-- Statement that executes the CTE
SELECT  rn.RowNumber, rn.RandomNumber
FROM RandomNumbers rn
INNER JOIN tbl_news n
ON rn.RowNumber = n.ID
ORDER BY rn.RandomNumber
您可以使用,尽管它可能无法在大量行上出色地执行,尽管NEWID也不能,例如


@DmitryBychenko:这不起作用,因为兰德公司将在下一个月返回相同的结果rows@DmitryBychenko不,一个键(例如15)定义了随机化的模式。只有NEWID,没有任何种子?@jarlh如果我们使用示例15,每次使用同一个键时,选择查询的顺序都是相同的。你的代码对我来说很好,但是有什么方法可以处理大量的行吗?我可能很快就跟你说过了,性能没有NEWID差多少,我刚刚在一个只有750k行的表上运行了一个比较,使用哈希字节的排序需要15秒才能完成,使用NEWID的排序平均需要14秒,每次运行5次
SELECT * FROM tbl_news ORDER BY NEWID(15);

5,1,3,2,4
SELECT * FROM tbl_news ORDER BY NEWID(36);

2,5,1,3,4
DECLARE @SEED INT = 100;
DECLARE @SIZE INT = 5;
-- url http://www.codeproject.com/Tips/811913/Generating-a-set-of-random-numbers-in-SQL-Server
WITH RandomNumbers (RowNumber, RandomNumber) AS (
    -- Anchor member definition
    SELECT  1                         AS RowNumber, 
            RAND(@SEED) AS RandomNumber
    UNION ALL
    -- Recursive member definition
    SELECT  rn.RowNumber + 1          AS RowNumber, 
            RAND( 1000000000* RAND(@SEED + rn.RowNumber))  AS RandomNumber
    FROM RandomNumbers rn
    WHERE rn.RowNumber < @SIZE
)
-- Statement that executes the CTE
SELECT  rn.RowNumber, rn.RandomNumber
FROM RandomNumbers rn
INNER JOIN tbl_news n
ON rn.RowNumber = n.ID
ORDER BY rn.RandomNumber
-- CREATE SAMPLE DATA
IF OBJECT_ID(N'tempdb..#tbl_news', 'U') IS NOT NULL DROP TABLE #tbl_news;
CREATE TABLE #tbl_news (NewsID INT IDENTITY);
INSERT #tbl_news DEFAULT VALUES;
INSERT #tbl_news DEFAULT VALUES;
INSERT #tbl_news DEFAULT VALUES;
INSERT #tbl_news DEFAULT VALUES;
INSERT #tbl_news DEFAULT VALUES;

-- DEFINE YOUR SORT KEY
DECLARE @Key INT = 15;

SELECT  *
FROM    #tbl_news
ORDER BY HASHBYTES('MD5', CONVERT(VARCHAR(10), NewsID + @Key));

-- SAME ORDER AS FIRST SELECT TO SHOW SORT IS REPEATABLE
SELECT  *
FROM    #tbl_news
ORDER BY HASHBYTES('MD5', CONVERT(VARCHAR(10), NewsID + @Key));


SET @Key = 36;

-- WITH A NEW KEY SHOW DIFFERENT ORDER
SELECT  *
FROM    #tbl_news
ORDER BY HASHBYTES('MD5', CONVERT(VARCHAR(10), NewsID + @Key));

-- BUT NEW ORDER IS STILL REPEATABLE
SELECT  *
FROM    #tbl_news
ORDER BY HASHBYTES('MD5', CONVERT(VARCHAR(10), NewsID + @Key));