【发布时间】:2016-01-09 17:32:24
【问题描述】:
我想将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
【问题讨论】:
-
要在分组中获得随机但唯一的数字,请参阅前面的post。 OP 通过逐行随机化(存储在临时表中)来回答他自己的问题,但将下一个随机数限制为先前未包含的数字。
-
感谢其他问题的链接。这可能是解决方案。我会调查的。
-
顺便说一句,我看你是 R-savy。毫无疑问,您可以导入您的表并在 R 中处理它。请注意:SQL 是一种声明性专用语言,最受DML and DDL 过程的限制。可能不建议超出范围;它不像通用的面向对象语言那样流畅和细致入微:Java、C#、VB、PHP、Python 或 R。
-
是的,这在 R 中很容易做到。由于表的大小,我正在寻找 SQL 解决方案。
标签: sql sqlite random permutation