Sql 随机选择,同时按百分比对多个组进行细分
我正在尝试为用户建立一个简单的系统,以生成调查将发送给的用户列表。列表的生成可能取决于各种约束。例如,“我们只想要来自美国和加拿大的人”或“我们只想要拥有2级或3级会员资格的人” 这一部分非常简单,我已经设置了表来捕获选择标准。不过,另一个标准是,他们可能希望获得每个项目的特定百分比。例如,“给我70%的美国用户和30%的加拿大用户。”同样,我认为我可以不费吹灰之力地做到这一点。他们会给出他们想要的用户数量,所以我可以乘以百分比,然后确保数字在四舍五入后仍然相加,这样我就可以继续了 但是,考虑到未来,如果他们希望按照两套标准进行一定百分比的细分,那该怎么办呢。例如,“给我70%的美国用户,30%的加拿大用户,同时给我50%的2级用户和50%的3级用户。”由于这不是当前的要求,我不打算让自己头疼,但如果有人有一个相当简单的算法(或SQL代码)来完成类似的任务,那么我很乐意看到它 虽然我更喜欢DB不可知的解决方案,但我使用的是MS SQL 2005,因此特定于该RDBMS的解决方案也不错 我当前使用的表结构与此类似:Sql 随机选择,同时按百分比对多个组进行细分,sql,sql-server-2005,random,weighted,Sql,Sql Server 2005,Random,Weighted,我正在尝试为用户建立一个简单的系统,以生成调查将发送给的用户列表。列表的生成可能取决于各种约束。例如,“我们只想要来自美国和加拿大的人”或“我们只想要拥有2级或3级会员资格的人” 这一部分非常简单,我已经设置了表来捕获选择标准。不过,另一个标准是,他们可能希望获得每个项目的特定百分比。例如,“给我70%的美国用户和30%的加拿大用户。”同样,我认为我可以不费吹灰之力地做到这一点。他们会给出他们想要的用户数量,所以我可以乘以百分比,然后确保数字在四舍五入后仍然相加,这样我就可以继续了 但是,考虑到
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%
您的评论是:没错,SQL并不是解决所有类型问题的最佳解决方案。您最好使用迭代算法来处理问题,而不是使用单一的基于集合的SQL查询。例如:
正如@Hogan所评论的,这可能是一个无法解决的NP完全问题。但许多这样的问题都有一个解决方案,它可以给你一个“足够好”的结果,尽管不是一个可证明的最佳结果。
相当简单的算法
——你认为这样的事情是可能的吗?@OMG Ponies-我正在使用MS SQL,但我故意忽略了它,以查看是否有ANSI SQL方法。如果有更好的MS特定方法,我会更新这个问题。我的意思是,我觉得这听起来像NPC,但我已经很久没有证明这一点了。谢谢比尔。这就是我的想法,但正如你所说的,可能有一个特定的标准集无法满足所要求的百分比。处理边缘案例可能非常困难。