sql - 如何根据计数进行更新 - SQL (postgres)

标签 sql postgresql

我有一个表,我们称它为“条目”,看起来像这样(简化):

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/

相关文章:

mysql - 在where子句中使用条件更好还是在join子句中使用?

html - SQL 查询内联表,打印到 HTML <select> 标签

mysql - 你如何强制 mysql LIKE 区分大小写?

sql - PostgreSQL 存储过程(函数)的正确语法是什么?

sql - Rails - 对过滤出的值执行分组函数时创建 nil 值

java - 如何修复 : "Parameter index out of range (2 > number of parameters, which is 1)."

sql - 防止 postgresql 中的值小于零

java - 使用 hibernate 的外键连接

postgresql - 如何从 terraform 中 Azure 托管 PostgreSQL 的现有备份文件恢复数据库?

SQL:选择具有条件优先级的随机行