Questions tagged «random»


3
创建多级层次结构,其中每个节点具有随机数量的子级
我需要创建一些涉及层次结构的测试数据。我可以简化并做几个CROSS JOINs,但这将使我的结构完全统一/没有任何变化。这不仅看起来很乏味,而且测试数据的缺乏变化有时掩盖了原本会发现的问题。因此,我想生成遵循以下规则的非统一层次结构: 3级深 1级随机是5-20个节点 级别2是1-10个节点,级别1的每个节点随机 级别3是1-5个节点,级别2的每个节点随机 所有分支的深度将为3级。此时,深度均匀是可以的。 在任何给定级别上,子节点的名称都可以重叠(即,子节点的名称在同一级别的所有节点上不必唯一)。 术语“随机”在此定义为伪随机,而不是唯一随机的。需要提到这一点,因为术语“随机”通常用于表示“不会产生重复项的给定集合的随机排序”。我接受random = random,如果第1级每个节点的子代数分别只有4、7和8,即使跨越第1级20个节点,每个节点的潜在散布为1-10个子代,那很好,因为那是随机的。 即使使用嵌套WHILE循环可以很容易地做到这一点,但首选还是要找到一种基于集合的方法。一般而言,生成测试数据并没有生产代码所具有的效率要求,但是针对基于集合的方法进行射击可能会更具教育意义,并且在将来找到基于集合的问题解决方法时会有所帮助。因此,WHILE循环不排除循环,只有在不可能使用基于集合的方法时才可以使用循环。 基于集合=理想情况下是单个查询,而不考虑CTE,APPLY等。因此,使用现有或内联数字表就可以了。使用WHILE / CURSOR /过程方法将不起作用。我想将数据的部分存储到临时表或表变量中就好了,只要这些操作都是基于集合的,没有循环即可。但是,话虽如此,除非可以证明多查询方法实际上更好,否则单查询方法可能比多查询更受青睐。还请记住,“更好”的构成通常是主观的;-)。还请记住,前一句中“通常”的使用也是主观的。 任何版本的SQL Server(我想是2005年及更高版本)都可以。 只有纯T-SQL:没有这些愚蠢的SQLCLR东西!至少在生成数据方面。创建目录和文件将使用SQLCLR完成。但是在这里,我只是专注于生成所创建内容的价值。 T-SQL多语句TVF被认为是过程性的,而不是基于集合的,即使在外部它们掩盖了集合中的过程方法。有时候这是绝对合适的。这不是那个时候之一。同样,也不允许使用T-SQL标量函数,这不仅是因为它们也是过程性的,而且查询优化器有时会缓存其值并重复该值,以使输出结果与预期不符。 T-SQL内联TVF(又名iTVF)是基于集合的okey-dokey,并且实际上与使用相同[ CROSS | OUTER ] APPLY,后者如上所述是可以的。 重复执行查询应产生与先前运行几乎不同的结果。 更新说明1:最终结果集应表示为Level3的每个不同节点都有一行,其完整路径从Level1开始。这意味着Level1和Level2值将必须在一个或多个行上重复,除非只有一个Level2节点仅包含一个Level3节点。 澄清更新2:每个节点都有一个非常好的首选项,每个节点都有一个名称或标签,而不仅仅是一个数字。这将使生成的测试数据更加有意义和现实。 我不确定这个附加信息是否重要,但是如果万一有助于了解某些情况,测试数据将与我对以下问题的回答有关: 将XML文件导入SQL Server 2012 尽管此时不相关,但是生成此层次结构的最终目标是创建一个目录结构来测试递归文件系统方法。级别1和2将是目录,级别3将最终成为文件名。我搜索了一下(在这里和通过Google),但只发现了一个参考,以生成随机层次结构: Linux:创建随机目录/文件层次结构 这个问题(在StackOverflow上)实际上在期望结果方面非常接近,因为它还试图创建用于测试的目录结构。但是,这个问题(以及答案)的重点是Linux / Unix shell脚本,而不是我们所生活的基于集合的世界。 现在,我知道了如何生成随机数据,并且已经在创建文件的内容,以便它们也可以显示变化。这里最棘手的部分是每个集合中元素的数量是随机的,而不是特定的字段。并且,每个节点内的元素数量必须与同一级别上的其他节点随机。 示例层次结构 Level 1 Level 3 |---- A | |-- 1 …

3
从集合中设置随机值
我需要将一些随机值放入数据库中,但是我不想最终得到完全随机化的文本(例如7hfg43d3)。相反,我想随机选择我自己提供的值之一。


4
如何在MySQL中执行复杂的GROUP BY?
我有一个表,其中包含几个进入其他表的键(每个键由多个列组成)。我希望能够将具有相同键的行分组在一起,但是我不想将所有行分组在一起。这不是简单GROUP BY的键,而是我希望能够使分组的数量为10。因此,如果某个特定键出现50次,则当我进行分组时(5组,共10组),我将获得5个结果。我也希望该分组在密钥内随机发生。 我不知道直接执行此操作的方法,而且我想出的环形交叉路方法无法正常工作。我想到的回旋解决方案是为每个键创建一个新列,该键将是一个整数,以使值i表示该ith键的出现(但以随机顺序)。然后,我可以进行整数除法,以使键中的每n个(例如10个)行具有相同的值,并且可以GROUP BY对该值进行a运算。 有没有更直接的方法来完成我刚刚描述的内容?这很尴尬,在创建新的索引列时遇到了问题(正如我在此问题中所述)。 编辑:首先请注意,这是针对MySQL。如果我的目标不清楚,我将添加一个示例。MySQL文档显示了一种接近目标的方法: CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ) ENGINE=MyISAM; INSERT INTO animals (grp,name) VALUES ('mammal','dog'),('mammal','cat'), ('bird','penguin'),('fish','lax'),('mammal','whale'), ('bird','ostrich'); SELECT * FROM animals ORDER BY grp,id; 这将创建一个表,该表虽然不是我想要的,但会变得接近: +--------+----+---------+ | grp | id | …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.