【问题标题】:How can I filter the result of a query based on restrictions如何根据限制过滤查询结果
【发布时间】: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


【解决方案1】:

如果您使用的是 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%,依此类推。

【讨论】:

  • 这对我不好,这样我会得到表中总结果的 5%。我的任务是在给定限制的情况下获得尽可能多的用户,并根据分区限制过滤它们。例如,让尽可能多的员工为 IT 工作,但需要过滤结果集,使其包含的女性人数是男性人数的两倍。
  • 我还不清楚。我有一个复杂的限制,目前只返回 user_ids,所以在这种形式下,我无法根据分区区分它们......我会更新问题,这样会更清楚
  • 所以听起来你需要从底部构建它。添加您的限制以获得您可以细分的人群。将其拆分为较小的任务,并在此过程中构建一些临时表。听起来是一部不错的作品。祝你好运:-)
  • 嗯,我有一个想法,如果我改变解析限制的方式,我可以将它拆分并合并它们,现在我唯一的问题是目前我不知道该怎么做它...我从不喜欢波兰语形式和东西...这个想法是删除括号并基于此进行查询。因此,例如 (1 OR 2) AND 3 将被修改为具有 1 AND 3 OR 2 AND 3,基于它 1 和 3 进行两个查询,计算它,计算它,2 AND 3 计算它,然后从这些中进行顶部选择两个并合并它
猜你喜欢
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多