我试图把一个简单的系统对用户生成列表用户调查中会被发送。列表生成可能取决于各种制约因素。例如,"我们只希望人们从美国和加拿大的"或"我们只希望的人有2级或3级成员。"

这部分是很容易的,我已经设置了表捕获的选择标准。一个额外的标准虽然是,他们可能想要获得一定百分比的每一个项目。例如,"给我的70%的美国用户和30%的加拿大用户。" 再次,我认为我可以这样做没有太多的麻烦。他们会给用户的数量,他们想要的,所以我只能多的百分比,然后确保数仍然增加了四舍五入后,我好去。

思考未来,虽然,如果他们想要的某一百分比划分的两套标准。例如,"给我提供70%美国,30%的加拿大,并在同一时间,50%的水平2的用户和50%的3级的用户。" 由于这不是一个目前需要的我不打算给自己头痛,但是,如果任何人有一个合理的简单的算法(或SQL代码)为实现这样的事情然后我会很乐意看到它。

虽然我会更喜欢一个数据库不可知的解决方案,我是MS SQL2005年,这样的解决方案的具体要,关系数据库的罚款。

该表格的结构,该结构目前,我正在使用类似于这样的:

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 query.例如:

  1. 挑一个随机行。
  2. 如果该行已经选择已经在前一次迭代,抛弃它。
  3. 如果行有助于保持步伐选择一个总的样品,70%美国,30%的加拿大,50%的2级、50%的3级,保持它。否则,放弃它。
  4. 如果你达到所需数量的样品,停止。
  5. 回步骤1。

当然,它得到棘手的如果你选择的行有助于平衡70/30%的比例的国家,但不平衡50/50%的比例的水平。你放弃它,或者没有?你也可能想要忽视的比率的时候你才选择了一些行。

作为@Hogan评论说,这可能是一个无法解决的NP-完整的问题。但是,许多这样的问题有一个解决方案,给你一个"足够好的"的结果,虽然不是一个可证明的最佳结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top