在postgresql中有条件地删除部分行

Deleting partial rows conditionally in postgresql

亲爱的 postgresql 大师,

我在 SQL 中遇到了这个有趣的要求。

Table : EmpBonus
id               long,
empid            long,
bonuspaid        date,
paidby           string

奖金可以每年支付。 paidby 列可以具有这两个值之一 (userA, userB)。

我必须使用 SQL 查询而不使用存储过程或函数来满足以下两个要求

我尝试使用两个常见的 table 表达式,

提前感谢您的帮助。

编辑

这是经过少许修改的答案副本

SELECT eb.id, eb.empId, eb.bonuspaid, eb.paidby, eb2.seqnum, eb2.a_paid 
FROM empbonus eb
JOIN (SELECT eb2.*
      ,COUNT(*) FILTER (WHERE paidby = 'A') OVER (PARTITION BY empid) AS a_paid
      ,row_number() OVER (PARTITION BY empid ORDER BY id) AS seqnum
      FROM empbonus eb2
     ) eb2
ON eb.id = eb2.id
WHERE ( 
         (eb2.a_paid > 0 AND eb.paidby = 'B') OR
         (eb2.a_paid = 0 AND eb.paidby = 'B' AND seqnum > 1)
      )
ORDER BY eb.empId, eb.id ;

嗯。 . .您可以使用子查询来计算您需要的附加信息。然后你可以在 delete:

中“加入”这个
delete empbonus eb
    from (select eb2.*,
                 count(*) filter (where paidby = 'A') over (partition by empid) as a_paid,
                 row_number() over (partition by empid, b_paid order by id) as seqnum
          from empbonus eb2
         ) eb2
    where eb.id = eb2.id and
          ( (eb2.a_paid > 0 and eb.paidby = 'B') or
            (eb2.a_paid = 0 and eb.paidby = 'B' and seqnum = 1)
          );