这是您可以做到的一种方法 - 请注意,我已经模仿了您的表格,其中包含所有不同的输入集,而您的实际表格没有,因此您必须修改查询以删除对example_no 列的引用。
我添加了第 5 种情况,即 NoFeed 和 Feed 具有相同优先级的就绪任务;我选择 NoFeed 比 Feed 具有更高的优先级,所以我只显示该类别。如果您需要更改它以显示 Feed 任务或同时显示两个任务,则需要修改 dense_rank 中的 order by 子句。
WITH your_table AS (SELECT 1 example_no, 7 priority, 'NoFeedBF' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 1 example_no, 5 priority, 'FeedWIL' CategoryType, 'ready' status, 'Feed' CategoryGroup FROM dual UNION ALL
SELECT 1 example_no, 6 priority, 'FeedSIL' CategoryType, 'ready' status, 'Feed' CategoryGroup FROM dual UNION ALL
SELECT 1 example_no, 7 priority, 'NoFeedDRM' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 1 example_no, 8 priority, 'NoFeedFx' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 1 example_no, 9 priority, 'NoFeedHK' CategoryType, NULL status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 1 example_no, 10 priority, 'Common' CategoryType, 'ready' status, 'Common' CategoryGroup FROM dual UNION ALL
SELECT 2 example_no, 7 priority, 'NoFeedBF' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 2 example_no, 5 priority, 'FeedWIL' CategoryType, 'ready' status, 'Feed' CategoryGroup FROM dual UNION ALL
SELECT 2 example_no, 6 priority, 'FeedSIL' CategoryType, 'ready' status, 'Feed' CategoryGroup FROM dual UNION ALL
SELECT 2 example_no, 7 priority, 'NoFeedDRM' CategoryType, 'running' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 2 example_no, 8 priority, 'NoFeedFx' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 2 example_no, 9 priority, 'NoFeedHK' CategoryType, NULL status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 2 example_no, 10 priority, 'Common' CategoryType, 'ready' status, 'Common' CategoryGroup FROM dual UNION ALL
SELECT 3 example_no, 7 priority, 'NoFeedBF' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 3 example_no, 5 priority, 'FeedWIL' CategoryType, 'ready' status, 'Feed' CategoryGroup FROM dual UNION ALL
SELECT 3 example_no, 6 priority, 'FeedSIL' CategoryType, 'ready' status, 'Feed' CategoryGroup FROM dual UNION ALL
SELECT 3 example_no, 7 priority, 'NoFeedDRM' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 3 example_no, 6 priority, 'NoFeedADHOC' CategoryType, 'running' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 3 example_no, 8 priority, 'NoFeedFx' CategoryType, NULL status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 3 example_no, 9 priority, 'NoFeedHK' CategoryType, NULL status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 3 example_no, 10 priority, 'Common' CategoryType, 'ready' status, 'Common' CategoryGroup FROM dual UNION ALL
SELECT 4 example_no, 7 priority, 'NoFeedBF' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 4 example_no, 5 priority, 'FeedWIL' CategoryType, 'running' status, 'Feed' CategoryGroup FROM dual UNION ALL
SELECT 4 example_no, 6 priority, 'FeedSIL' CategoryType, 'ready' status, 'Feed' CategoryGroup FROM dual UNION ALL
SELECT 4 example_no, 7 priority, 'NoFeedDRM' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 4 example_no, 6 priority, 'NoFeedADHOC' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 4 example_no, 8 priority, 'NoFeedFx' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 4 example_no, 9 priority, 'NoFeedHK' CategoryType, NULL status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 4 example_no, 10 priority, 'Common' CategoryType, 'ready' status, 'Common' CategoryGroup FROM dual UNION ALL
SELECT 5 example_no, 7 priority, 'NoFeedBF' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 5 example_no, 8 priority, 'FeedWIL' CategoryType, 'ready' status, 'Feed' CategoryGroup FROM dual UNION ALL
SELECT 5 example_no, 6 priority, 'FeedSIL' CategoryType, 'ready' status, 'Feed' CategoryGroup FROM dual UNION ALL
SELECT 5 example_no, 7 priority, 'NoFeedDRM' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 5 example_no, 8 priority, 'NoFeedFx' CategoryType, 'ready' status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 5 example_no, 9 priority, 'NoFeedHK' CategoryType, NULL status, 'NoFeed' CategoryGroup FROM dual UNION ALL
SELECT 5 example_no, 10 priority, 'Common' CategoryType, 'ready' status, 'Common' CategoryGroup FROM dual),
curr_running AS (SELECT example_no,
priority,
categorytype,
status,
categorygroup,
nofeed_running,
feed_running,
CASE WHEN categorygroup = 'NoFeed' AND feed_running = 1 THEN NULL
WHEN categorygroup = 'Feed' AND nofeed_running = 1 THEN NULL
ELSE categorygroup
END new_categorygroup
FROM (SELECT example_no,
priority,
categorytype,
status,
categorygroup,
MAX(CASE WHEN categorygroup = 'NoFeed' AND status = 'running' THEN 1 END) OVER (PARTITION BY example_no) nofeed_running,
MAX(CASE WHEN categorygroup = 'Feed' AND status = 'running' THEN 1 END) OVER (PARTITION BY example_no) feed_running
FROM your_table
WHERE status IN ('ready', 'running'))),
results AS (SELECT example_no,
priority,
categorytype,
status,
categorygroup,
new_categorygroup,
nofeed_running,
feed_running,
dense_rank() OVER (PARTITION BY example_no, CASE WHEN new_categorygroup IN ('NoFeed', 'Feed') THEN 'Feed' ELSE new_categorygroup END ORDER BY priority DESC, new_categorygroup DESC) dr
FROM curr_running
WHERE status = 'ready'
AND new_categorygroup IS NOT NULL)
SELECT example_no,
priority,
categorytype,
status,
categorygroup
FROM results
WHERE dr = 1
ORDER BY example_no,
dr,
categorytype;
EXAMPLE_NO PRIORITY CATEGORYTYPE STATUS CATEGORYGROUP
---------- ---------- ------------ ------- -------------
1 10 Common ready Common
1 8 NoFeedFx ready NoFeed
2 10 Common ready Common
2 8 NoFeedFx ready NoFeed
3 10 Common ready Common
3 7 NoFeedBF ready NoFeed
3 7 NoFeedDRM ready NoFeed
4 10 Common ready Common
4 6 FeedSIL ready Feed
5 10 Common ready Common
5 8 NoFeedFx ready NoFeed
这通过使用MAX 分析函数来确定Feed 和NoFeed 类别的每组数据中是否已经存在正在运行的任务,然后使用它来输出类别组列的新版本,其中类别对于我们不想与其他组中的任务同时运行的组,设置为 null。
一旦我们获得了这些信息,我们就会执行 dense_rank 以找到我们感兴趣的每个类别具有最高密集排名的就绪行。
最后,我们只选择dense_rank 为1 的那些行——即最高优先级的行。