我有一个表,我们称它为“条目”,看起来像这样(简化):
id [pk]
user_id [fk]
created [date]
processed [boolean, default false]
我想创建一个 UPDATE 查询,它将所有条目的已处理标志设置为 true,每个用户的最新 3 个条目除外(就创建的列而言是最新的)。因此,对于以下条目:
1,456,2009-06-01,false
2,456,2009-05-01,false
3,456,2009-04-01,false
4,456,2009-03-01,false
只有条目 4 会将其处理标志更改为 true。
有人知道我该怎么做吗?
最佳答案
我不懂 postgres,但这是标准的 SQL,可能对你有用。
update entries set
processed = true
where (
select count(*)
from entries as E
where E.user_id = entries.user_id
and E.created > entries.created
) >= 3
换句话说,只要以后有相同 user_id 的三个或更多条目,就将处理过的列更新为 true。我假设 [created] 列对于给定的 user_id 是唯一的。如果不是,您将需要一个额外的标准来确定您所说的“最新”。
在 SQL Server 中,您可以执行此操作,这更容易遵循并且可能会更有效地执行:
with T(id, user_id, created, processed, rk) as (
select
id, user_id, created, processed,
row_number() over (
partition by user_id
order by created desc, id
)
from entries
)
update T set
processed = true
where rk > 3;
更新 CTE 是一项非标准功能,并非所有数据库系统都支持 row_number。
关于sql - 如何根据计数进行更新 - SQL (postgres),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1254673/