迭代CTE中的随机值

时间:2019-06-28 09:46:42

标签: sql sql-server random common-table-expression

使用SQL Server 2016 +

从表格中选择随机行时遇到了一些困难,表格已经缩小到如何生成随机数的问题。为了提高效率,使用TOP 10 * ORDER BY NEWID()会很慢。在下面的代码中,我使用了固定的种子来获得可重复的结果,但是在实际情况中,我不会这样做。

代码示例:

SELECT  RAND(100) RN
,       RAND()
,       RAND()
,       RAND()
,       RAND();

SELECT  RAND(100) RN
UNION ALL SELECT  RAND()
UNION ALL SELECT  RAND()
UNION ALL SELECT  RAND()
UNION ALL SELECT  RAND();

WITH cte AS
    (SELECT 1         ID
     ,      RAND(100) RN
     UNION ALL
     SELECT cte.ID + 1
     ,      RAND()
       FROM cte
      WHERE ID < 5)
SELECT  RN
  FROM  cte;

结果集

RN                                                                                          
---------------------- ---------------------- ---------------------- ---------------------- ----------------------
0.715436657367485      0.28463380767982       0.0131039082850364     0.28769876521071       0.100505471175005

(1 row affected)

RN
----------------------
0.715436657367485
0.28463380767982
0.0131039082850364
0.28769876521071
0.100505471175005

(5 rows affected)

RN
----------------------
0.715436657367485
0.28463380767982
0.28463380767982
0.28463380767982
0.28463380767982

(5 rows affected)

从结果中可以看到,当我串联或通过联合调用RAND()函数时,每次调用都会得到不同的结果。但是,如果我在迭代cte中调用该函数,那么我会重复得到相同的值。

此代码是显示问题的示例,而不是整个代码集。我仅以创建该示例为例来说明问题。我有一个基于ChecksumNewID()以及模数调用和乘法的组合的解决方案,可以为我提供所需范围内的值,但是这相当复杂,对于仅生成一个列表来说似乎过于繁琐。一定范围内的随机数。

我正在寻找可以提供的任何指导

  1. 为什么会这样
  2. 任何解决问题的方法
  3. 用于生成随机数列表的其他选项(不是RBAR)

非常感谢。

1 个答案:

答案 0 :(得分:1)

import numpy as np import tensorflow as tf import keras from keras.layers import Input, BatchNormalization, Activation from keras.layers import ZeroPadding2D, MaxPooling2D, Dense from keras.layers import Reshape, Add, Dropout from keras.layers import Conv2D from keras.layers import Conv3DTranspose, Conv2DTranspose from keras.initializers import VarianceScaling from keras.models import Model from keras.regularizers import l2 from keras.optimizers import SGD import sys # hyperparameters BATCH_NORM_MOMENTUM = 0.1 BATCH_NORM_EPS = 1e-5 KERNEL_REGULARIZER = 0.0001 batchSize = 4 sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True) def step1(input_shape = (3, 256, 256)): step = 'step1_' X_input = Input(input_shape, name = step + 'input') X = Conv2D(64, (7, 7), strides = (2, 2), padding='same', data_format = 'channels_first', kernel_initializer="he_normal",kernel_regularizer=l2(KERNEL_REGULARIZER), name = step+'b1_conv_a',)(X_input) X = BatchNormalization(axis = 1, momentum=BATCH_NORM_MOMENTUM, epsilon = BATCH_NORM_EPS, name = step+'b1_bn_a')(X) X = Activation('relu', name = step+'b1_act_a')(X) X = MaxPooling2D((3, 3), strides=(2, 2), data_format='channels_first', padding='same', name = step + 'b1_maxpool2d_a')(X) print(X.shape) model = Model(inputs = X_input, outputs = X, name='step1') return model step1Model = step1((3,256,256)) 在查询中返回“常量”值。也就是说,在查询中,每个“提及”都会对其进行一次评估。

如果运行,您会看到以下内容:

ValueError: Shape must be rank 1 but is rank 0 for 'step1_b1_bn_a/cond/Reshape_4' (op: 'Reshape') with input shapes: [1,64,1,1], [].

每行都有两个不同的值。但是,这些列具有相同的值。

无论如何,规范的答案是使用RAND()。这为每次调用的select rand(), rand() from (values (1), (2), (3)) v(x); 提供了一个随机种子:

RAND(CHECKSUM(NEWID()))

这可能足以获取随机值列表。我怀疑您的 real 问题是不同的-类似于从表中提取随机行。如果这是真正的问题,请提出一个 new 问题或检查类似的问题。