add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
CREATE TABLE table_name (NAME_, DATE_, PARAM_, VALUE) AS
SELECT 'A', DATE '2023-09-26', 'ABOV', NULL FROM DUAL UNION ALL
SELECT 'A', DATE '2023-09-26', 'NEXT', 11 FROM DUAL UNION ALL
SELECT 'A', DATE '2023-09-27', 'NEXT', 10 FROM DUAL UNION ALL
SELECT 'A', DATE '2023-09-28', 'NEXT', 12 FROM DUAL UNION ALL

SELECT 'B', DATE '2023-09-25', 'NEXT', 2 FROM DUAL UNION ALL
SELECT 'B', DATE '2023-09-28', 'ABOV', NULL FROM DUAL UNION ALL
SELECT 'B', DATE '2023-09-28', 'NEXT', 4 FROM DUAL;
7 rows affected
SELECT name_, date_, param_, value
FROM (
SELECT t.name_,
d.date_,
p.param_,
COALESCE(
t.value,
CASE WHEN t.date_ IS NOT NULL AND t.param_ IS NOT NULL THEN 0 END
) AS value,
ROW_NUMBER() OVER (PARTITION BY t.name_ ORDER BY d.date_, p.param_) AS rn
FROM (SELECT 'ABOV' AS param_ FROM DUAL UNION ALL
SELECT 'NEXT' FROM DUAL) p
CROSS JOIN
(SELECT DISTINCT date_ FROM table_name) d
LEFT OUTER JOIN table_name t
PARTITION BY (t.name_)
ON ( p.param_ = t.param_
AND d.date_ = t.date_)
)
MODEL
PARTITION BY (name_)
DIMENSION BY (rn)
MEASURES (date_, param_, value)
RULES (
value[rn>1] = COALESCE(
value[cv()],
CASE param_[cv()]
WHEN 'ABOV'
THEN value[cv() - 2]
ELSE value[cv() - 1]
END
)
)
NAME_ DATE_ PARAM_ VALUE
A 2023-09-25 00:00:00 ABOV null
A 2023-09-25 00:00:00 NEXT null
A 2023-09-26 00:00:00 ABOV 0
A 2023-09-26 00:00:00 NEXT 11
A 2023-09-27 00:00:00 ABOV 0
A 2023-09-27 00:00:00 NEXT 10
A 2023-09-28 00:00:00 ABOV 0
A 2023-09-28 00:00:00 NEXT 12
B 2023-09-25 00:00:00 ABOV null
B 2023-09-25 00:00:00 NEXT 2
B 2023-09-26 00:00:00 ABOV null
B 2023-09-26 00:00:00 NEXT null
B 2023-09-27 00:00:00 ABOV null
B 2023-09-27 00:00:00 NEXT null
B 2023-09-28 00:00:00 ABOV 0
B 2023-09-28 00:00:00 NEXT 4
WITH dates (name_, date_, end_date) AS (
SELECT name_, MIN(date_), MAX(date_)
FROM table_name
GROUP BY name_
UNION ALL
SELECT name_, date_ + 1, end_date
FROM dates
WHERE date_ + 1 <= end_date
),
params (param_) AS (
SELECT 'ABOV' AS param_ FROM DUAL UNION ALL
SELECT 'NEXT' FROM DUAL
),
combined (name_, date_, param_, value, rn) AS (
SELECT d.name_,
d.date_,
p.param_,
COALESCE(
t.value,
CASE WHEN t.date_ IS NOT NULL AND t.param_ IS NOT NULL THEN 0 END
) AS value,
ROW_NUMBER() OVER (PARTITION BY d.name_ ORDER BY d.date_, p.param_) AS rn
FROM params p
CROSS JOIN dates d
LEFT OUTER JOIN table_name t
ON ( p.param_ = t.param_
AND d.name_ = t.name_
AND d.date_ = t.date_ )
)
SELECT name_, date_, param_, value
FROM combined
MODEL
PARTITION BY (name_)
DIMENSION BY (rn)
MEASURES (date_, param_, value)
RULES (
NAME_ DATE_ PARAM_ VALUE
A 2023-09-26 00:00:00 ABOV 0
A 2023-09-26 00:00:00 NEXT 11
A 2023-09-27 00:00:00 ABOV 0
A 2023-09-27 00:00:00 NEXT 10
A 2023-09-28 00:00:00 ABOV 0
A 2023-09-28 00:00:00 NEXT 12
B 2023-09-25 00:00:00 ABOV null
B 2023-09-25 00:00:00 NEXT 2
B 2023-09-26 00:00:00 ABOV null
B 2023-09-26 00:00:00 NEXT null
B 2023-09-27 00:00:00 ABOV null
B 2023-09-27 00:00:00 NEXT null
B 2023-09-28 00:00:00 ABOV 0
B 2023-09-28 00:00:00 NEXT 4