-1

我对动态生成的 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: 我的表结构有点奇怪,它更像是一个链接表。为了简化它并显示我的问题,让我们考虑这个与我的格式相似的示例表。我有用户 ID、问题、问题答案、年龄、性别。相同的 user_id 出现多次,因为这只是一个链接表,用户主要回答多个问题。到目前为止,我知道它的结构不是最优的,但它不是我设计的,也不是我可以修改的。我的任务是获取完成所有限制的不同 user_id,并根据另一个限制集过滤结果以进行百分比分区。到目前为止,我根据限制得到了正​​确的 user_id,但我不知道如何修改它才能进行百分比分区。

所以,更准确地说,我有一个限制集,可以是 (1 OR 2) AND 3 AND 4 等等。我从中创建了一个反向抛光表格,以便能够按顺序解决它。根据每个限制(例如男性,年龄在 18-24 岁之间),我创建查询,然后将其与联合或相交连接。只要我不需要对它进行分区,它就可以很好地工作。但不幸的是,情况确实如此,因为我的结果不包含有关已回答问题的任何详细信息,也没有仅包含 user_id 的年龄或性别,我不知道如何修改它,以便能够过滤结果以获得想要的分区大小按百分比。

4

1 回答 1

0

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

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

取自此链接

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

于 2013-09-24T10:04:34.600 回答