为每个组分配随机顺序

时间:2015-10-12 09:32:07

标签: sql sqlite random permutation

我想将TableA中的每一行扩展为4行。结果包含TableA的所有列和另外两列:SetID =范围从0到3,按TableA分组时为唯一。 Random =同一分组中SetID的随机排列。

我使用SQLite并且更喜欢纯SQL解决方案。

表A:

Description
-----------
A
B

期望的输出:

Description | SetID | Random
------------|-------|-------
A           |     0 | 2
A           |     1 | 0
A           |     2 | 3
A           |     3 | 1
B           |     0 | 3
B           |     1 | 2
B           |     2 | 0
B           |     3 | 1

到目前为止,我的尝试解决了TableA中每行创建4行但未正确获取排列的问题。 wrong将包含一个0到3之间的随机数。对于Description中的每个唯一值,我只需要一个0,1,2和3,它们的顺序应该是随机的。

SELECT
  Description,
  SetID,
  abs(random()) % 4 AS wrong
FROM
  TableA
LEFT JOIN
  TableB
ON
  1 = 1

表B:

SetID
-----
0
1
2
3

2 个答案:

答案 0 :(得分:0)

使用cross join

SELECT Description,
       SetID,
       abs(random()) % 4 AS wrong
FROM TableA
CROSS JOIN TableB

答案 1 :(得分:0)

考虑一下你专业的解决方案R.如你所知,R维护着优秀的数据库包,其中一个是RSQLite。此外,R可以通过连接运行命令,而无需导入非常大的数据集。

您的解决方案基本上是随机抽样而无需替换。只需让R运行采样并将列表项连接成一个SQL字符串。

下面在SQLite数据库中创建一个表,其中R将CREATE TABLE命令发送到SQL引擎。没有导入或导出数据。如果需要每四行运行一次,请在输出sql字符串的已定义函数中运行迭代循环。对于追加查询,请将CREATE TABLE AS更改为INSERT INTO ... SELECT语句。

library(RSQLite)    

sqlite <- dbDriver("SQLite")
conn <- dbConnect(sqlite,"C:\\Path\\To\\Database\\File\\newexample.db")

# SAMPLE WITHOUT REPLACEMENT
randomnums <- as.list(sample(0:3, 4, replace=F))

# SQL CONCATENATION 
sql <- sprintf("CREATE TABLE PermutationsTable AS 
             SELECT a.Description, b.SetID, 
            (select %d from TableB WHERE TableB.SetID = b.SetID AND TableB.SetID=0
             union select %d from TableB WHERE TableB.SetID = b.SetID AND TableB.SetID=1
             union select %d from TableB WHERE TableB.SetID = b.SetID AND TableB.SetID=2
             union select %d from TableB WHERE TableB.SetID = b.SetID AND TableB.SetID=3) 
             As RandomNumber
             from TableA a, TableB b;",
                  randomnums[[1]], randomnums[[2]],
                  randomnums[[3]], randomnums[[4]])

# RUN QUERY
dbSendQuery(conn, sql)
dbDisconnect(conn)

您会注意到嵌套的联合子查询。这用于实现每行的内联随机数。另外,要从所有表中返回所有可能的组合,不需要连接语句,只需在FROM子句中列出表。