我想将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
答案 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
子句中列出表。