为表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*