Sqlite

如何在更新語句中使用視窗函式?

  • December 7, 2021

我有一個簡單的 SQL 模式(SQLite),具有以下定義:

tbl_data (`id` INTEGER, `value` INTEGER, `result` INTEGER);

它有一些記錄(範例):

在此處輸入圖像描述

如果value>10並且如果前面沒有包含value>10的行,我想更新此表以設置result=1

前面的限制應該是2,並且 order 是id

所以期望的目標是有這個:

在此處輸入圖像描述

這是我的遊樂場:https ://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=5b1cfa5d4b4c78bd31f7427eca20b0b5

我需要更新的實際表包含 >800k 行,因此效率很重要。

我怎樣才能做到這一點?


with cte1 as (
select id, value, lag(value,1,0) over w as prev1, lag(value,2,0) over w as prev2
from tbl_data
window w as (order by id)
),
cte2 as (
select id
from cte1
where value > 10
and prev1 &lt= 10
and prev2 &lt= 10
)
update tbl_data 
set result = 1
where id in (select id from cte2);

引用自:https://dba.stackexchange.com/questions/303622