将PARTITION与LIMIT一起使用

将PARTITION与LIMIT一起使用

我有下面的“队列”表

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/

10-15 20:48