【问题标题】:How do I select few random values from a datatable column如何从数据表列中选择几个随机值
【发布时间】:2013-12-18 20:31:59
【问题描述】:

我有一个带有 studentid 列的 DataTable。它有 1000 条记录。我需要选择大约 30 个随机 id 并将它们插入到数据库表中。然后,我需要排除这 30 个 id,选择另外 30 个随机 id,等等,直到 1000 条记录。

而且,在每次迭代中,我都会有给定数量的 id,因此只应选择多个 id(300 不是恒定的,可能是 30、25、23、24...)。

【问题讨论】:

  • 你的意思是来自 C# 的 DataTable 吗?
  • 匿名是在 C# 中..
  • 为什么是 sql-server 标签?

标签: c# asp.net sql-server c#-4.0 random


【解决方案1】:

这可能会让你开始:

--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()

【讨论】:

    【解决方案2】:

    创建一个包含 1000 个学生 ID 和 shuffle 的数组。然后就从数组的开头开始往前走。

    如果一定要持久化,可以将数组的内容写入一个临时表,并按顺序单步执行。

    或者,你可以这样做:

    SELECT id FROM table
    ORDER BY RAND()
    

    并将其写入临时表。我不记得 SQL 语法。 SELECT INTO?这会将所有 id 以随机顺序放入一个表中,然后您可以从头开始一次选择 30 个。

    【讨论】:

    • @user3116746:这有什么关系?您只是将 ID 选择到临时表中。然后从临时表中提取 30 个 ID,并从原始表中选择具有这些 ID 的记录。
    【解决方案3】:

    这里可以容忍一些动态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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-11
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多