SQL 更新 - 根据多个条件省略 MIN 数量的记录
SQL update - leaving out MIN amount of records, based on multiple conditions
我有一个 "News" table,它与 "NewsState" table 是一对多的。需要更新名为 "expired" 的 NewsState 字段(设置为真),具体取决于 "News" table 中 "date" 字段的值,在这些条件下 [=11] =]
- 如果日期早于 24 小时,则相关的 NewsStates 应该已过期。
- 如果在过去 24 小时内少于 50 "News"(假设有 10 个新闻)那么 40 个超过 24 小时的最新新闻也不应过期,因此 MIN 50 总是未过期。
- 如果过去 24 小时内有超过 50 条新闻,则它们的 NewsStates 也应该不会过期。
我想不出不包含一些繁重的子选择和 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(为简单起见,使用不同的规则编号)。
我有一个 "News" table,它与 "NewsState" table 是一对多的。需要更新名为 "expired" 的 NewsState 字段(设置为真),具体取决于 "News" table 中 "date" 字段的值,在这些条件下 [=11] =]
- 如果日期早于 24 小时,则相关的 NewsStates 应该已过期。
- 如果在过去 24 小时内少于 50 "News"(假设有 10 个新闻)那么 40 个超过 24 小时的最新新闻也不应过期,因此 MIN 50 总是未过期。
- 如果过去 24 小时内有超过 50 条新闻,则它们的 NewsStates 也应该不会过期。
我想不出不包含一些繁重的子选择和 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(为简单起见,使用不同的规则编号)。