[英]How to get a subset DataTable from another DataTable filtered by few column values?
[英]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.