SQL 更新 - 根据多个条件省略 MIN 数量的记录

SQL update - leaving out MIN amount of records, based on multiple conditions

我有一个 "News" table,它与 "NewsState" table 是一对多的。需要更新名为 "expired" 的 NewsState 字段(设置为真),具体取决于 "News" table 中 "date" 字段的值,在这些条件下 [=11] =]

我想不出不包含一些繁重的子选择和 IN 子句的解决方案。

这可以通过 window functions、f.ex.:
来完成 (我假设你有一个 news_id 作为 News table 中的主键——这也是 NewsState 中的外键——如果不是这样,你可以使用 ROW() 构造函数比较 IN 表达式中的多个列。我还假设 expired 属于 boolean。)

update NewsState set expired = news_id in (
  select news_id
  from (
    select *, row_number() over (order by date desc)
    from News
  ) n
  where  date > (now() - interval '24 hour')
     or  row_number <= 50
);

Some SQLFiddle samples(为简单起见,使用不同的规则编号)。