|
本帖最后由 〇〇 于 2023-8-24 12:01 编辑
造了一些数据
create or replace table tmp2 as select date'2000-01-01'+ interval (i) day t_date, (random()*10)::int*10 data1 from range(10000)t(i);
--newkid
with ta as(
select t2.*,dense_rank() over(order by min_date) grp
from (
select t.*
,min(t_date) over(partition by data1,grp) min_date
from (
select tmp2.*
,row_number()over(order by t_date) - row_number()over(partition by data1 order by t_date) grp
from tmp2
) t
) t2
)
select max(grp) from ta;
┌──────────┐
│ max(grp) │
│ int64 │
├──────────┤
│ 9494 │
└──────────┘
Run Time (s): real 0.068 user 0.608404 sys 0.046800
--last_value
with t as(
select tmp2.*,lag(data1)over(order by t_date)data2,row_number()over(order by t_date) a from tmp2 order by t_date
),
t2 as
(select t.*,case when data1=data2 then NULL else t_date end x from t order by t_date),
t3 as(select t2.*,last_value(x ignore nulls)over(order by t_date)min_date from t2),
tb as(select t3.*,dense_rank() over(order by min_date) grp from t3)
select max(grp) from tb;
┌──────────┐
│ max(grp) │
│ int64 │
├──────────┤
│ 9066 │
└──────────┘
Run Time (s): real 0.024 user 0.015600 sys 0.000000
--dhhb
with recursive t as(
select t_date,data1,row_number()over(order by t_date) rn from tmp2),
t2 (t_date,data1,rn,grp)as (
select t_date,data1,rn,1 grp from t where rn=1
union all
select t.t_date,t.data1,t.rn, case when t.data1=t2.data1 then t2.grp else t2.grp+1 end grp from t, t2 where t.rn=t2.rn+1)
select max(grp) from t2;
┌──────────┐
│ max(grp) │
│ int32 │
├──────────┤
│ 9066 │
└──────────┘
Run Time (s): real 25.711 user 138.528888 sys 1.872012
|
|