我有下面的“队列”表
id | type | started_at | finished_at
----------------------------------
1 | A | some_date | some_date
2 | A | some_date | NULL
3 | A | NULL | NULL
4 | A | NULL | NULL
5 | B | some_date | some_date
6 | B | NULL | NULL
7 | B | NULL | NULL
8 | B | NULL | NULL
9 | C | NULL | NULL
10 | C | NULL | NULL
11 | C | NULL | NULL
12 | C | NULL | NULL
13 | D | some_date | NULL
14 | D | NULL | NULL
15 | D | NULL | NULL
16 | D | NULL | NULL
我想要的是得到下一个项目处理。
每种类型同时运行最多应该有2个。
因为在类型a和D上已经有一个“running”条目,
期望的结果是这样的。
id | type | started_at | finished_at
3 | A | NULL | NULL
6 | B | NULL | NULL
7 | B | NULL | NULL
9 | C | NULL | NULL
10 | C | NULL | NULL
14 | D | NULL | NULL
到目前为止,我得到的是每种类型的下两个项目。
WITH TOSTART AS (
SELECT *, ROW_NUMBER()
over (
PARTITION BY type
order by id
) AS RowNo
FROM table_name
where started_at is null and finished_at is null
)
SELECT id FROM TOSTART WHERE RowNo <= 2 -- max parallel
我需要的是考虑到“地位”。
最佳答案
您应该首先删除所有已完成的条目:
select id, type
from (
select row_number() over (partition by type order by id), *
from (
select *
from my_table
where finished_at is null
) s
) s
where started_at is null
and row_number <= 2;
id | type
----+------
3 | A
6 | B
7 | B
9 | C
10 | C
14 | D
(6 rows)
关于sql - PostgreSQL:将PARTITION与LIMIT一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49179213/