簡體   English   中英

如何從數據表列中選擇一些隨機值

[英]How do I select few random values from a datatable column

我有一個帶有studentid列的DataTable。 它具有1000條記錄。 我需要選擇30個隨機ID並將它們插入數據庫表中。 然后,我需要排除這30個ID,再選擇30個隨機ID,依此類推,直到有1000條記錄。

而且,在每次迭代中,我都會有給定數量的id,因此只能選擇許多id(300不是常數,它可能是30、25、23、24 ...)。

這可以幫助您入門:

--Create a temporary table
CREATE TABLE #temp (id INTEGER)
go

--Insert 30 randow ids into the #temp table, excluding any ids that were previously picked.    
-- run this line as many times as needed.
INSERT INTO #temp select top 30 id from [student] where [id] not in (select [id] from #temp) order by newid()

創建一個具有1000個學生ID的數組,然后對數組進行隨機排列。 然后,只需從數組的開頭開始,然后繼續即可。

如果必須是持久性的,則可以將數組的內容寫入臨時表並按順序進行遍歷。

或者,您可以執行以下操作:

SELECT id FROM table
ORDER BY RAND()

並將其寫入臨時表。 我不記得SQL語法了。 SELECT INTO 這樣會將所有ID按隨機順序放入表格中,然后您可以從頭開始一次將它們從30個中挑選出來。

在這里可以允許使用某些動態SQL。

IF ( OBJECT_ID( 'tempdb.dbo.#t_Student' ) IS NULL )
BEGIN
    CREATE TABLE #t_Student
    (
        StudentID           INTEGER
    );

    SET NOCOUNT ON;

    DECLARE @i  INTEGER;
        SET @i = 0;
    WHILE ( @i < 1000 )
    BEGIN
        INSERT INTO #t_Student ( StudentID )
        VALUES ( @i );
        SET @i = @i + 1;
    END;

    SET NOCOUNT OFF;
END;

IF ( OBJECT_ID( 'tempdb.dbo.#t_Processed' ) IS NOT NULL )
BEGIN
    DROP TABLE #t_Processed;
END;

DECLARE @Random         INTEGER,
        @LowerBound     INTEGER,
        @UpperBound     INTEGER,
        @SQL            NVARCHAR( MAX );
    SET @LowerBound = 1;
    SET @UpperBound = 30;

CREATE TABLE #t_Processed
(
    StudentID           INTEGER
);

WHILE ( (   SELECT  COUNT( 1 )
            FROM    dbo.#t_Processed ) <
        (   SELECT  COUNT( 1 )
            FROM    dbo.#t_Student ) )
BEGIN
    SET @Random = ROUND( ( ( @UpperBound - @LowerBound ) * RAND() + @LowerBound ), 0 );

    SET @SQL = '
        SELECT  TOP ' + LEFT( @Random, 10 ) + ' StudentID
        FROM    #t_Student
        WHERE   StudentID NOT IN (  SELECT  StudentID
                                    FROM    #t_Processed )                          
        ORDER BY NEWID();';
    INSERT INTO #t_Processed ( StudentID )
    EXECUTE dbo.sp_executesql @statement = @SQL;
END;
GO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM