Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 随机选择,同时按百分比对多个组进行细分_Sql_Sql Server 2005_Random_Weighted - Fatal编程技术网

Sql 随机选择,同时按百分比对多个组进行细分

Sql 随机选择,同时按百分比对多个组进行细分,sql,sql-server-2005,random,weighted,Sql,Sql Server 2005,Random,Weighted,我正在尝试为用户建立一个简单的系统,以生成调查将发送给的用户列表。列表的生成可能取决于各种约束。例如,“我们只想要来自美国和加拿大的人”或“我们只想要拥有2级或3级会员资格的人” 这一部分非常简单,我已经设置了表来捕获选择标准。不过,另一个标准是,他们可能希望获得每个项目的特定百分比。例如,“给我70%的美国用户和30%的加拿大用户。”同样,我认为我可以不费吹灰之力地做到这一点。他们会给出他们想要的用户数量,所以我可以乘以百分比,然后确保数字在四舍五入后仍然相加,这样我就可以继续了 但是,考虑到

我正在尝试为用户建立一个简单的系统,以生成调查将发送给的用户列表。列表的生成可能取决于各种约束。例如,“我们只想要来自美国和加拿大的人”或“我们只想要拥有2级或3级会员资格的人”

这一部分非常简单,我已经设置了表来捕获选择标准。不过,另一个标准是,他们可能希望获得每个项目的特定百分比。例如,“给我70%的美国用户和30%的加拿大用户。”同样,我认为我可以不费吹灰之力地做到这一点。他们会给出他们想要的用户数量,所以我可以乘以百分比,然后确保数字在四舍五入后仍然相加,这样我就可以继续了

但是,考虑到未来,如果他们希望按照两套标准进行一定百分比的细分,那该怎么办呢。例如,“给我70%的美国用户,30%的加拿大用户,同时给我50%的2级用户和50%的3级用户。”由于这不是当前的要求,我不打算让自己头疼,但如果有人有一个相当简单的算法(或SQL代码)来完成类似的任务,那么我很乐意看到它

虽然我更喜欢DB不可知的解决方案,但我使用的是MS SQL 2005,因此特定于该RDBMS的解决方案也不错

我当前使用的表结构与此类似:

CREATE TABLE Selection_Templates
(
     template_code     VARCHAR(20)     NOT NULL,
     template_name     VARCHAR(100)    NOT NULL,
     CONSTRAINT PK_Selection_Templates PRIMARY KEY CLUSTERED (template_code),
     CONSTRAINT UI_Selection_Templates UNIQUE (template_name)
)
GO
CREATE TABLE Selection_Template_Countries
(
     template_code            VARCHAR(20)       NOT NULL,
     country_code             CHAR(3)           NOT NULL,
     selection_percentage     DECIMAL(2, 2)     NULL,
     CONSTRAINT PK_Selection_Template_Countries PRIMARY KEY CLUSTERED (template_code, country_code),
     CONSTRAINT CK_Selection_Template_Countries_selection_percentage CHECK (selection_percentage > 0),
     CONSTRAINT FK_Selection_Template_Countries_Selection_Template FOREIGN KEY (template_code) REFERENCES Selection_Templates (template_code)
)
GO
CREATE TABLE Selection_Template_User_Levels
(
     template_code            VARCHAR(20)       NOT NULL,
     user_level               SMALLINT          NOT NULL,
     selection_percentage     DECIMAL(2, 2)     NULL,
     CONSTRAINT PK_Selection_Template_User_Levels PRIMARY KEY CLUSTERED (template_code, user_level),
     CONSTRAINT CK_Selection_Template_User_Levels_selection_percentage CHECK (selection_percentage > 0),
     CONSTRAINT FK_Selection_Template_User_Levels_Selection_Template FOREIGN KEY (template_code) REFERENCES Selection_Templates (template_code)
)

您可以将问题分解为四组随机用户:

  • 美国用户,2级,选择所需样本总数的35%
  • 加拿大用户,2级,选择所需样本总数的15%
  • 美国用户,3级,选择所需样本总数的35%
  • 加拿大用户,3级,选择所需样本总数的15%
如果有第三个标准,把问题分成八组。等等

在美国和加拿大这两组用户中,获得50%的2级和50%的3级似乎是人为的。因为它应该是随机的,所以你可能会期望它变化得更大一些。另外,如果加拿大的3级用户数量不多,占总数的15%,又该怎么办

随着标准变得越来越有选择性,你自然会从总样本的随机性中抽身。最终,您可以有一个长长的标准列表,这样只有一个子集的用户可以满足它,然后就不会有任何随机性


您的评论是:没错,SQL并不是解决所有类型问题的最佳解决方案。您最好使用迭代算法来处理问题,而不是使用单一的基于集合的SQL查询。例如:

  • 随机选取一行
  • 如果在上一次迭代中已经选择了该行,则放弃该行
  • 如果该行有助于保持选择70%美国、30%加拿大、50%二级、50%三级的总样本的速度,请保留该行。否则,将其丢弃
  • 如果达到所需的样本数,请停止
  • 循环回到步骤1
  • 当然,如果你选择一行有助于平衡70/30%的国家比例,但不平衡50/50%的水平比例,这会变得很棘手。你是否丢弃它?而且,当您只选择了前几行时,您可能希望忽略这些比率


    正如@Hogan所评论的,这可能是一个无法解决的NP完全问题。但许多这样的问题都有一个解决方案,它可以给你一个“足够好”的结果,尽管不是一个可证明的最佳结果。

    相当简单的算法
    ——你认为这样的事情是可能的吗?@OMG Ponies-我正在使用MS SQL,但我故意忽略了它,以查看是否有ANSI SQL方法。如果有更好的MS特定方法,我会更新这个问题。我的意思是,我觉得这听起来像NPC,但我已经很久没有证明这一点了。谢谢比尔。这就是我的想法,但正如你所说的,可能有一个特定的标准集无法满足所要求的百分比。处理边缘案例可能非常困难。