必须有更好的方法来做到这一点,但下面的例子有效(丑陋,我相信有人会发布一些聪明而聪明的东西,但我今天还没有足够的咖啡来做聪明,并且有效)。
create or replace temporary table stacko_64351844 (
id number,
status varchar(20),
ts varchar(20),
desired number);
INSERT INTO stacko_64351844
VALUES
(1, 'Off', '0345', 0),
(1, 'Charge', '0400', 1),
(1, 'Charge', '0415', 1),
(1, 'Off', '0430', 0),
(1, 'Charge', '0445', 2),
(1, 'Off', '0500', 0),
(1, 'Charge', '0515', 3),
(1, 'Charge', '0530', 3),
(1, 'Charge', '0545', 3),
(1, 'Charge', '0600', 3),
(1, 'Off', '0615', 0);
SELECT id,
status, ts,
desired,
NVL(calc_desired, max(calc_desired) over (partition by id order by id, ts rows between unbounded preceding and current row)) as calc_desired
FROM (
SELECT id,
status,
ts,
desired,
tmp_desired,
CASE
WHEN status = 'Off' THEN 0
WHEN (status != 'Charge' AND status = lag(status, 1, null)
over (partition by id order by id, ts, status DESC) )
THEN null
ELSE
sum(tmp_desired) over (partition by id, tmp_desired order by id, ts rows between unbounded preceding and current row)
end as calc_desired
FROM (
SELECT id,
status,
ts,
desired,
CASE
WHEN status = 'Off' THEN 0
WHEN status = lag(status, 1, null)
over (partition by id order by id, ts, status DESC)
THEN null
ELSE
1
end as tmp_desired
FROM stacko_64351844)
ORDER BY id, ts, status DESC);
RESULTS
ID STATUS TS DESIRED CALC_DESIRED
1 Off 0345 0 0
1 Charge 0400 1 1
1 Charge 0415 1 1
1 Off 0430 0 0
1 Charge 0445 2 2
1 Off 0500 0 0
1 Charge 0515 3 3
1 Charge 0530 3 3
1 Charge 0545 3 3
1 Charge 0600 3 3
1 Off 0615 0 0
我希望这会有所帮助...丰富
附言如果这个(或另一个)答案对您有帮助,请花点时间“接受”有帮助的答案
通过单击答案旁边的复选标记将其从“灰色”切换为“已填充”。