postgresql-如果有n个未标记行可用,则选择n个行,并更新标志

postgresql-如果有n个未标记行可用,则选择n个行,并更新标志,sql,postgresql,Sql,Postgresql,我在postgres中有一个不断更新的表。如果有5行可用,我想选择前5行,并更新与之关联的标志 At first the table looks like this id name flag 11 ss - 22 aa - 12 bb - 13 cc - 14 dd - 23 ab - 24 cd - 25 ee

我在postgres中有一个不断更新的表。如果有5行可用,我想选择前5行,并更新与之关联的标志

At first the table looks like this
    id   name   flag
    11    ss     -
    22    aa     -
    12    bb     -
    13    cc     -
    14    dd     -
    23    ab     -
    24    cd     -
    25    ee     -
在第一次选择5行之后,表应该如下所示

    id   name   flag
    11    ss     Y
    22    aa     Y
    12    bb     Y
    13    cc     Y
    14    dd     Y
    23    ab     -
    24    cd     -
    25    ee     -

下一次选择不应该发生,因为不应该只剩下5行了

窗口函数可以用来计算结果集中的所有行。试试像这样的东西

WITH unflagged AS (
    SELECT id FROM (
       SELECT id, count(*) over() AS cnt
       FROM your_table
       WHERE flag IS NULL
    ) WHERE cnt >= 5
    LIMIT 5
)
UPDATE your_table SET flag = Y
WHERE id IN (SELECT * FROM unflagged)

上面是将cnt设置为8(因为只有8行),我想要的正是前5行,其中标志为Null。你是对的,我错过了限制。该查询只是为了说明如何获取和过滤结果集中的记录数。