每个父行的随机基数
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,而不是数字表。以上是关于每个父行的随机基数的主要内容,如果未能解决你的问题,请参考以下文章
HTML:如何使用 AngularJs 填充第一行是父行和后续行是子行的行