Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为表MSAccess/sql中的组提取随机值_Sql_Sql Server_Ms Access - Fatal编程技术网

为表MSAccess/sql中的组提取随机值

为表MSAccess/sql中的组提取随机值,sql,sql-server,ms-access,Sql,Sql Server,Ms Access,首先,我知道这是有史以来最糟糕的事情,但万一有人知道怎么做,我会非常感激 主要问题:如何根据数据中的组数生成随机值 例如: tblBill ID FirstName Bill Tax Group 1 Mark $40 $6 1 2 Fred $25 $2 1 3 Jane $25 $2 1 4 Brad $40 $6 2 5 Amy $25 $2 2 6 Pat $25

首先,我知道这是有史以来最糟糕的事情,但万一有人知道怎么做,我会非常感激

主要问题:如何根据数据中的组数生成随机值

例如:

 tblBill
 ID FirstName  Bill Tax Group
 1      Mark  $40  $6   1
 2      Fred  $25  $2   1
 3      Jane  $25  $2   1
 4      Brad  $40  $6   2
 5      Amy   $25  $2   2
 6      Pat   $25  $2   2
 7      Lilly $25  $2   2
我想:

[组1的随机名称]

[组2的随机名称]

我当前的(坏的)解决方案:

创建两个查询:

QryRand1
    SELECT TOP 1 tblBill.FirstName, tblBill.ID
    FROM tblBill
    WHERE tblBill.Group=1
    ORDER BY Rnd(ID);

QryRand2
    SELECT TOP 1 tblBill.FirstName, tblBill.ID
    FROM tblBill
    WHERE (((tblBill.Group)='2'))
    ORDER BY Rnd(ID);
创建联合:

SELECT qryRnd1.[ID], qryRnd1.[FirstName] from qryRnd1
UNION ALL SELECT qryRnd2.[ID], qryRnd2.[FirstName] from qryRnd2;
给我:

ID  FirstName
3   Jane
6   Pat
(刷新时会随机化)

但我不止有两个组,有没有办法创建一个表,为存在的n个组中的每一个生成一个随机值


如果我有30个组,我会为每个组创建一个qry,然后合并所有30个查询吗?这是唯一的解决方案吗?

我想您会发现在SQL Server上实现这一点要容易得多,因为您可以使用窗口函数:

SELECT *
FROM
    (
        SELECT tblBill.FirstName, 
            tblBill.ID, 
            ROW_NUMBER() OVER (PARTITION BY group ORDER BY NewID()) as randomRow
        FROM tblBill        
    ) as sub
WHERE sub.randomRow = 1

ROW\u NUMBER()
正在为每个组的每个记录生成一个行号,并将该行号随机化。然后,外部查询只从该窗口函数中获取“1”的记录。

我想您会发现在SQL Server上实现这一点要容易得多,因为您可以使用窗口函数:

SELECT *
FROM
    (
        SELECT tblBill.FirstName, 
            tblBill.ID, 
            ROW_NUMBER() OVER (PARTITION BY group ORDER BY NewID()) as randomRow
        FROM tblBill        
    ) as sub
WHERE sub.randomRow = 1

ROW\u NUMBER()
正在为每个组的每个记录生成一个行号,并将该行号随机化。然后外部查询只获取从该窗口函数中获取“1”的记录。

下面是我上面讨论的SQL Server版本的一些示例代码,使用您的数据:

CREATE TABLE #tmp (id int not null,
    name varchar(20) not null,
    Amt1 Money not null,
    Amt2 Money not null,
    GroupID int not null
    )

INSERT INTO #tmp Values 
( 1,      'Mark',  $40,  $6,   1),
( 2,      'Fred',  $25,  $2,   1),
( 3,      'Jane',  $25,  $2,   1),
( 4,      'Brad',  $40,  $6,   2),
( 5,      'Amy',  $25,  $2,   2),
( 6,      'Pat',   $25,  $2,   2),
( 7,      'Lilly', $25,  $2,   2)

SELECT [Name],
    GroupID
FROM (
    SELECT [name],
        ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY NewID()) as x,
        GroupID
    FROM #tmp t) src
WHERE x = 1

下面是我上面讨论的SQL Server版本的一些示例代码,使用您的数据:

CREATE TABLE #tmp (id int not null,
    name varchar(20) not null,
    Amt1 Money not null,
    Amt2 Money not null,
    GroupID int not null
    )

INSERT INTO #tmp Values 
( 1,      'Mark',  $40,  $6,   1),
( 2,      'Fred',  $25,  $2,   1),
( 3,      'Jane',  $25,  $2,   1),
( 4,      'Brad',  $40,  $6,   2),
( 5,      'Amy',  $25,  $2,   2),
( 6,      'Pat',   $25,  $2,   2),
( 7,      'Lilly', $25,  $2,   2)

SELECT [Name],
    GroupID
FROM (
    SELECT [name],
        ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY NewID()) as x,
        GroupID
    FROM #tmp t) src
WHERE x = 1

在Access中,可以使用子查询:

SELECT tblBill.Group, tblBill.FirstName
FROM tblBill
WHERE tblBill.ID IN
    (SELECT TOP 1 T.ID
    FROM tblBill As T
    WHERE T.Group = tblBill.Group
    ORDER BY Rnd(-Timer() * [ID]))

使用Timer()可防止在启动Access并运行查询时获取相同的选择。

在Access中,您可以使用子查询:

SELECT tblBill.Group, tblBill.FirstName
FROM tblBill
WHERE tblBill.ID IN
    (SELECT TOP 1 T.ID
    FROM tblBill As T
    WHERE T.Group = tblBill.Group
    ORDER BY Rnd(-Timer() * [ID]))

使用Timer()可以防止在启动Access和运行查询时获取相同的选择。

您使用的是Access还是sql server?它们不是同一件事。Access,但如果需要,我可以将表移动到sql server。这里似乎有两个不同的问题。一个是关于获取随机行,另一个是关于跨组分割值。真正的问题是什么?发布一些ddl、样本数据和期望的输出将使这一点更加清晰。根据不同的组生成随机值。我将删除后半部分。(随机化)在SQL Server中,通过使用
orderbynewid()
进行随机排序非常简单。但是,Access中没有内置的机制。您需要这样编写查询以保证随机顺序:
从myTable order BY Rnd(-10000000*TimeValue(Now())*[id])中选择TOP 1*
您使用的是Access还是sql server?它们不是同一件事。Access,但如果需要,我可以将表移动到sql server。这里似乎有两个不同的问题。一个是关于获取随机行,另一个是关于跨组分割值。真正的问题是什么?发布一些ddl、样本数据和期望的输出将使这一点更加清晰。根据不同的组生成随机值。我将删除后半部分。(随机化)在SQL Server中,通过使用
orderbynewid()
进行随机排序非常简单。但是,Access中没有内置的机制。您需要像这样编写查询以保证随机顺序:
从myTable order BY Rnd(-10000000*TimeValue(Now())*[id])中选择TOP 1*