我正在实施一个具有多个优先级的排队系统。
我想要一个查询,它可以返回 X 行,每个优先级至少有Y 行。
例如:
假设队列有 3 个优先级(高、中和低),我希望每个优先级分别有 3、2 和 1 行。
如果表格如下所示:
-----------------
| Id | Priority |
-----------------
| 1 | High |
| 2 | High |
| 3 | High |
| 4 | High |
| 5 | Medium |
| 6 | Medium |
| 7 | Low |
-----------------
三个简单的联合查询将返回 (1, 2, 3, 5, 6, 7)。
SELECT TOP 3 Id FROM tbl WHERE Priority = 'High' UNION
SELECT TOP 2 Id FROM tbl WHERE Priority = 'Medium' UNION
SELECT TOP 1 Id FROM tbl WHERE Priority = 'Low'
但是,当表不包含足够的特定优先级时会出现问题:
-----------------
| Id | Priority |
-----------------
| 1 | High |
| 2 | High |
| 3 | High |
| 4 | High |
| 5 | Medium |
| 6 | Low |
| 7 | Low |
-----------------
我想让它返回(1、2、3、4、5、6)。
使用最高优先级来填补空白(在这种情况下,使用第 4 高行,因为没有足够的媒介)。
是否有可以适应这种情况的查询,或者我会在我的应用程序内部而不是在 SQL 级别更好地过滤?