如何根据限制过滤查询结果

时间:2013-09-24 07:57:34

标签: sql sql-server database tsql filter

我遇到动态生成的SQL查询问题。我有一个巨大的数据库,用户存储在不同的表中。我需要动态创建一个查询,它将根据不同分区的一些限制返回user_id-s。到目前为止,我创建了一个逻辑,它将根据限制创建我的查询,但我无法弄清楚如何过滤结果以进行不同的分区。 例如:

我有以下内容:

1:男
2:女
3:年龄在18-24岁之间 4:年龄在25-99岁之间 5:在IBM工作 可以说我有50k女性,50k男性

现在,如果我的限制是(1或2)和5,这意味着如果是在IBM工作的男性或女性,我会生成类似这样的内容

SELECT DISTINCT user_id from usertable1 where age in (0,1) 
INTERSECT
SELECT DISTINCT user_id from usertable2 where work_place = 'IBM'

现在我的问题是这还不够,有时候我必须对结果集的用户ID进行分区,例如我在结果列表中有33%的男性和66%的女性。我不知道怎么做得好。我试着计算一下我有多少女性和男性用户,然后对它们应用一个顶部,如下:

SELECT DISTINCT  top 25000 user_id from usertable1 where age in (0)
UNION 
SELECT DISTINCT top 50000  user_id from usertable1 where age in (1)
SELECT DISTINCT user_id from usertable2 where work_place = 'IBM'

然而,这并没有给我正确的解决方案,问题是如果我的名单中没有女性用户在IBM工作,那么将返回25k男性和0女性,这不是33%男性和66%女......

现在为了使其复杂化,我可以进行更难的分区,结果必须包含33%的男性,其中75&年龄在18-24岁到25岁之间。年龄在25-99岁之间,女性占66%,75岁以上年龄在18-24岁到25岁之间。年龄

所以我的问题是我不知道如何解决这两个问题,它可以在庞大的数据库上工作,50k男性和50k女性相比整个数据库都很小。任何人对我的问题中至少有一个有任何想法吗?

编辑1: 我的表有一点奇怪的结构,它更像是一个链接表。为了简化它并显示我的问题,让我们考虑这个具有类似我的格式的示例表。 我有user_id,question,question_answer,年龄,性别。同一个user_id多次出现,因为这只是一个链接表,而用户主要回答多个问题。到目前为止,我所知道的结构并不是最优的,但它并非由我设计,也不能被我修改。我的任务是获取完成所有限制的不同user_id,并过滤结果以根据另一个限制集进行百分比分区。到目前为止,我根据限制获得了正确的user_id,但我不知道如何修改它以便能够进行百分比分区。

所以,更准确地说,我有一个限制集,可以是(1或2)和3和4之类的东西。我从中创建了一个反向抛光形式,以便能够按顺序解决它。基于每个限制(例如,男性,年龄在18-24岁之间),我创建了quires,然后我用union或intersect连接起来。只要我不需要对它进行分区,这项工作就可以了。但不幸的是,情况就是这样,因为我的结果不包含有关已回答问题的任何细节,也没有年龄和性别只有user_id,我不知道如何修改它,能够过滤结果以获得所需的分区大小百分比。

1 个答案:

答案 0 :(得分:0)

如果您使用的是SQL Server 2005+,则可以使用TOP(x)PERCENT

USE AdventureWorks2012;
GO
SELECT TOP(5)PERCENT JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;

取自this link

只需阅读帖子的其余部分,但您应该能够使用CTE解决第二个问题并将它们链接在一起。这会让你说70%的东西会进入你的第二个CTE,你占据70%的40%,依此类推。