Problem description & analysis:
The field n of a certain database table is used for sorting, and the x field is an integer, sometimes with consecutive 0s.
Task: Now we need to add a calculated column def, which requires the initial value of def to be 0; If the current row x>2, set def to 1; When encountering three consecutive x=0, reset the current def to 0; In other cases, keep def the same as the previous row.
Code comparisons:
SQL:
with cte as (
select *
,(x > 2) exceeded_2
,(0 = all(array[ x
,lag(x,1,0)over w1
,lag(x,2,0)over w1
]
)
) as should_switch
from have
window w1 as (order by n) )
,cte2 as (
select *,sum(should_switch::int)over(order by n) def_on_period
from cte
)
select n,x,(bool_or(exceeded_2) over w2)::int as def
from cte2
window w2 as (partition by def_on_period
order by n);
SQL requires multiple window functions and multiple subqueries to implement relative position calculation, and the code is complex and difficult to understand.
SPL: SPL provides the syntax for expressing relative positions:
👉🏻Try.DEMO
A1: Load data and add an empty calculated column.
A2: Modify the calculated column, if the current row x>2, set def to 1; If three consecutive rows are 0, then def is set to 0; Otherwise, the def remains unchanged (set to the previous row’s def). [-1] represents the previous row.
✨ esProc SPL FREE Download — Free Trial Available, Download Now!
Top comments (2)
Feel free to share your thoughts with us!
🔅Discord
🔅Reddit
Check out the code comparisons and experience the efficiency of SPL yourself!
📒Discord
📒Reddit