作为一个基本示例,我有一个查询,它有效地生成了一个包含值列表(ID号)的表,每个值都附加到一个特定的类别.作为一个简化的例子,它会产生这样的结果(但规模要大得多):

IDS Categories
12345 type 1
12456 type 6
77689 type 3
32456 type 4
67431 type 2
13356 type 2
..... .....

使用这个表,我想填充另一个表,该表给了我一个ID号列表,每个类别在该列表中的数量有一个限制,对照一种基于范围的图表进行交叉引用.例如,如果我的第一个表中有5-15个类型1的ID,我希望具有ID列的新表中有3个类型1 ID,如果第一个表中有15-30个类型1 ID,我希望在新表中有6个类型1 ID.

这种基于范围的限制将适用于每个类别,ID将全部填充新表中的同一列.在最终表中结束的顺序或特定ID无关紧要,只要正确的ID数最终成为ID号最终列表的一部分.这用于基于类别为一种QA相关流程提供ID号的半随机抽样.

如果部分内容不清楚,我可以尽力解释更多.我最初的 idea 是使用变量作为限制子句,但这是不可能的.我一直在试图通过一个 case 陈述来解决这个问题,但我真的没有取得任何进展,但我觉得我在这张纸一样薄的墙上,我就是无法突破.

推荐答案

您可以使用两个窗口功能:

  • COUNT以跟踪每个类别的ID数量
  • ROW_NUMBER来唯一标识每个类别中的每个id

收集这些信息后,就可以保留满足以下任一条件的所有行:

  • 行数小于或等于30>&燃气轮机;排名小于或等于6
  • 小于或等于15行的计数>&燃气轮机;排名小于或等于3
WITH cte AS (
    SELECT IDS,
           Categories,
           ROW_NUMBER() OVER(ORDER BY IDS PARTITION BY Categories) AS rn
           COUNT(IDS) OVER(PARTITION BY Categories)                AS cnt
    FROM tab
)
SELECT * 
FROM cte
WHERE (rn <= 3 AND cnt <= 15)
   OR (rn <= 6 AND cnt <= 30)

Note:如果您对特定的排序有顾虑,则需要修复ROW_NUMBER窗口函数内的ORDER BY子句.

Sql相关问答推荐

Microsoft Access UNION将长文本字段限制为255个字符

表名数组

SUM(条件)在Oracle?

使用来自不同深度的嵌套组的值执行计算的干净方法?

retrofit AWS Athena中的JSON

SQL Select 最小优先级

SQL:如何将相应位置的两个数组中的元素组合在一起

SQL:如何取上一年的平均值?

在Postgres中合并相似的表

明细表中没有记录如何更新主表的值为0

PostgreSQL:查找继承表中的特定记录属于哪个表

将SQL Server查询改进为;线程安全;

如何创建snowflake表(动态查找数据类型)并从阶段加载(AWS S3)?

使用 union 的有序结果获取行数

计算不同模式的时间跨度

SQL 搜索 - 获取最大值日期的奇怪行为

使用 SAVE TRANSACTION 时 BEGIN 和 COMMIT 语句的数量不匹配

连接表时避免重复

从 JSON 数组中移除对象

在 AWS athena 的视图之上创建视图时,如何消除此错误:列别名列表有 1 个条目但t有 4 列可用?