作为一个基本示例,我有一个查询,它有效地生成一个包含值(ID号)列表的表,每个值都附加到一个特定的类别。作为一个简化的例子,它将产生如下内容(但规模要大得多):
IDS | Categories | 12345 | 1型 |
---|---|
12456 | 类型6 |
77689 | 3型 |
32456 | type 4 |
67431 | 2型 |
13356 | 2型 |
… | … |
您可以使用两个窗口函数:
COUNT
跟踪每个类别的id数量ROW_NUMBER
唯一标识每个类别中的每个id
收集了这些信息后,保留满足以下条件之一的所有行就足够了:
- 小于或等于30的行数>>
- 的行数小于等于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)
注意:如果您对特定的排序有顾虑,您需要在ROW_NUMBER
窗口函数中修正ORDER BY
子句。