【发布时间】:2013-09-29 08:03:49
【问题描述】:
我对动态生成的 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、age、gender。相同的 user_id 出现多次,因为这只是一个链接表,用户主要回答多个问题。到目前为止,我知道它的结构并不是最优的,但它不是我设计的,也不是我可以修改的。我的任务是获取完成所有限制的不同 user_id,并根据另一个限制集过滤结果以进行百分比分区。到目前为止,我根据限制得到了正确的 user_id,但我不知道如何修改它才能进行百分比分区。
所以,更准确地说,我有一个限制集,可以是 (1 OR 2) AND 3 AND 4 等等。我从中创建了一个反向抛光表格,以便能够按顺序解决它。根据每个限制(例如男性,年龄在 18-24 岁之间),我创建查询,然后将其与联合或相交连接。只要我不需要对它进行分区,它就可以很好地工作。但不幸的是,情况确实如此,因为我的结果不包含有关已回答问题的任何详细信息,也没有仅包含 user_id 的年龄或性别,我不知道如何修改它,以便能够过滤结果以获得想要的分区大小按百分比。
【问题讨论】:
-
我不明白你的要求。您是否尝试从较大的记录超集中返回一个随机样本,其中所选样本符合特定分布?
-
我需要根据给定分区的一些限制返回 user_id-s。所以我需要返回例如在 IBM 工作的男性或女性用户,但返回的 user_id-s 列表必须与分区大小匹配(33% 男性和 66%)女性
-
我编辑了帖子,希望这样更有意义。
-
如果 IBM 在 100 名员工中雇佣了 50% 的男性怎么办?您是否希望它返回 50 个女性和 25 个男性(如果是,which 个男性?)? 6 名女性和 3 名男性(这再次适合您的分区)(再次 which 行)?零行是因为分区不匹配?还有什么?
-
是的,如果 IBM 有 100 名员工,其中 50% 是男性,而我的分区设置是 33% 男性和 66% 女性,我希望它返回 50 名女性和 25 名男性。所以基本上我想要同时满足限制和分区的最大可用用户数。
标签: sql sql-server database tsql filter