SELECT
REPORT_MONTH,
CATEGORY_A,
LAST_VALUE(CATEGORY_A) IGNORE NULLS OVER (ORDER BY REPORT_MONTH RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) LAST_CATEGORY_A,
FIRST_VALUE(CATEGORY_A) IGNORE NULLS OVER (ORDER BY REPORT_MONTH RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) NEXT_CATEGORY_A
FROM (
SELECT TO_DATE('01-JAN-2016') REPORT_MONTH, 100 CATEGORY_A FROM DUAL
UNION ALL
SELECT TO_DATE('01-FEB-2016') REPORT_MONTH, NULL CATEGORY_A FROM DUAL
UNION ALL
SELECT TO_DATE('01-MAR-2016') REPORT_MONTH, NULL CATEGORY_A FROM DUAL
UNION ALL
SELECT TO_DATE('01-APR-2016') REPORT_MONTH, NULL CATEGORY_A FROM DUAL
UNION ALL
SELECT TO_DATE('01-MAY-2016') REPORT_MONTH, 200 CATEGORY_A FROM DUAL
)