每个父行的随机基数

Posted

技术标签:

【中文标题】每个父行的随机基数【英文标题】:Random cardinality of rows per parent row 【发布时间】:2017-03-22 12:21:07 【问题描述】:

我正在以Customer -< Booking 的形式为客户生成一些测试数据,我想要实现的是为每个客户生成随机数量的预订(1 到 25 之间)。

已经为Customer 表生成了测试数据,我想我可以使用n <= ABS(CHECKSUM(NEWID())) % 25 作为数字表的连接条件来生成每行的随机基数,但是我的尝试必须非常次优,因为它正在接管15分钟返回。理想情况下,如果可能的话,我希望将其缩短到 2 分钟以下。

我的鹅卵石尝试如下:

;WITH CTE_BookingCounts AS (
  SELECT
    CustomerId,
    ABS(CHECKSUM(NEWID())) % 25 AS R
  FROM dbo.Customer
)
SELECT
  B.CustomerId,
  N.n AS BookingIndex
FROM dbo.Customer C
INNER JOIN CTE_BookingCounts BC ON BC.CustomerId = C.CustomerId
INNER JOIN #numbers N ON N.n <= BC.R;

如果存在的话,谁能建议我如何重组这个查询,甚至是一种完全不同的方法?

【问题讨论】:

【参考方案1】:

如果你只需要为每一行设置一个随机数,这个怎么样?

SELECT B.CustomerId, n.n AS BookingIndex
FROM dbo.Customer C INNER JOIN
     #numbers n 
     ON rand(CHECKSUM(NEWID())) * 25 - 1 <= n.n;

-1 是为了确保至少选择了一行。

我应该注意,这会重新计算BC 中每一行的值。这实际上可能更适合您的目的:

SELECT B.CustomerId, n.n AS BookingIndex
FROM (SELECT C.*, rand(CHECKSUM(NEWID())) * 25 + 1 as numrows
      FROM dbo.Customer C
     ) C INNER JOIN
     #numbrers n
     ON n.n <= numrows;

【讨论】:

感谢您的回答,但我不知道您是否建议我应该删除 CTE 或 #numbers 表。 @ChrisPickford 。 . .我自己也很困惑。我们的想法是摆脱 CTE,而不是数字表。

以上是关于每个父行的随机基数的主要内容,如果未能解决你的问题,请参考以下文章

父行的颤振列自动高度

如何在 Oracle SQL 中检索父行的所有递归子代?

HTML:如何使用 AngularJs 填充第一行是父行和后续行是子行的行

如何从 qtreeview 中的父行中获取特定列

MySQL:如何将子项的 SUM() 值更新为同一表中的父行?

jquery DataTables 父行和子行作为一条记录而不是两条记录发布到服务器