首页 > 解决方案 > SQL如何更新满足要求的每n行

问题描述

我有一个表,如果它满足行要求,我想在每 n 行更新一个列数据。
我的表有很多列,但键是 Object_Id(以防这可能对创建临时表有用)
但我要更新的是 online_status,它看起来如下所示,但规模更大,所以我通常有 10 行同一时间,但它们都有 %Online% ,总共大约 2000 行(在线和大约另外 2000 行离线)。我只需要更新每 2-4 行重复的 10 行。
这里的表格图片:(由于某种原因表格格式不好)
表格

所以我尝试的是:
这会提取与在线条件匹配的每条第三条记录的列表,我只需要一种更新它的方法,但无法通过它。

SELECT * FROM (SELECT *, row_number() over() rn FROM people 
WHERE online_status LIKE '%Online%') foo WHERE online_status LIKE '%Online%' AND foo.rn % 3 =0

我还尝试过的是:
但是这已经更新了每一行。不是我需要的。

UPDATE people 
SET online_status = 'Offline 00:00-24:00' 
WHERE people.Object_id IN
(SELECT *
FROM 
(SELECT people.Object_id, row_number() over() rn FROM people 
WHERE online_status LIKE '%Online%') foo WHERE people LIKE '%Online%' AND foo.rn % 3 =0);

有没有办法从上面的选择代码中获取列表并简单地更新它或运行一些脚本,可以将它添加到临时表并存储对象 ID,如果对象 ID 与临时表匹配,下一个脚本将更新主表。
感谢您的任何帮助 :)

标签: sqlmariadb

解决方案


不要选择其他列,但Object_id在子查询中WHERE people.Object_id IN (..)

UPDATE people 
SET online_status = 'Offline 00:00-24:00' 
WHERE Object_id IN
( SELECT Object_id
  FROM 
  ( SELECT p.Object_id, row_number() over() rn 
    FROM people p
    WHERE p.online_status LIKE '%Online%') foo
  WHERE foo.rn % 3 = 0
 );

推荐阅读