I would like to fill in the missing null values from my dataset. I have a dataset like this
+---------------------+------+-------------+
| ORDER_DATE | SHOP | SALESPERSON |
+---------------------+------+-------------+
| 14/04/2017 04:44:27 | A | MIKE |
+---------------------+------+-------------+
| 14/04/2017 04:44:55 | A | |
+---------------------+------+-------------+
| 14/04/2017 04:45:07 | A | TIM |
+---------------------+------+-------------+
| 14/04/2017 04:45:30 | A | |
+---------------------+------+-------------+
| 14/04/2017 04:45:43 | B | |
+---------------------+------+-------------+
| 14/04/2017 04:46:13 | B | JOHN |
+---------------------+------+-------------+
| 14/04/2017 04:46:28 | B | |
+---------------------+------+-------------+
| 14/04/2017 04:58:32 | C | |
+---------------------+------+-------------+
| 14/04/2017 04:58:41 | C | MELINDA |
+---------------------+------+-------------+
and I like to fill out the seller’s information shared by the store using the first value found to zero in the store. I tried this, but it does not give the correct result (see below). How to solve this?
CREATE TABLE SALES (
ORDER_DATE DATE,
SHOP VARCHAR2(30 CHAR),
SALESPERSON VARCHAR2(30 CHAR)
)
;
REM INSERTING INTO SALES
SET DEFINE OFF;
INSERT INTO SALES (ORDER_DATE,SHOP,SALESPERSON) VALUES (TO_DATE('14/04/2017 04:44:27','DD/MM/YYYY HH24:MI:SS'),'A','MIKE');
INSERT INTO SALES (ORDER_DATE,SHOP,SALESPERSON) VALUES (TO_DATE('14/04/2017 04:44:55','DD/MM/YYYY HH24:MI:SS'),'A',NULL);
INSERT INTO SALES (ORDER_DATE,SHOP,SALESPERSON) VALUES (TO_DATE('14/04/2017 04:45:07','DD/MM/YYYY HH24:MI:SS'),'A','TIM');
INSERT INTO SALES (ORDER_DATE,SHOP,SALESPERSON) VALUES (TO_DATE('14/04/2017 04:45:30','DD/MM/YYYY HH24:MI:SS'),'A',NULL);
INSERT INTO SALES (ORDER_DATE,SHOP,SALESPERSON) VALUES (TO_DATE('14/04/2017 04:45:43','DD/MM/YYYY HH24:MI:SS'),'B',NULL);
INSERT INTO SALES (ORDER_DATE,SHOP,SALESPERSON) VALUES (TO_DATE('14/04/2017 04:46:13','DD/MM/YYYY HH24:MI:SS'),'B','JOHN');
INSERT INTO SALES (ORDER_DATE,SHOP,SALESPERSON) VALUES (TO_DATE('14/04/2017 04:46:28','DD/MM/YYYY HH24:MI:SS'),'B',NULL);
INSERT INTO SALES (ORDER_DATE,SHOP,SALESPERSON) VALUES (TO_DATE('14/04/2017 04:58:32','DD/MM/YYYY HH24:MI:SS'),'C',NULL);
INSERT INTO SALES (ORDER_DATE,SHOP,SALESPERSON) VALUES (TO_DATE('14/04/2017 04:58:41','DD/MM/YYYY HH24:MI:SS'),'C','MELINDA');
COMMIT;
SELECT * FROM SALES ORDER BY SHOP, ORDER_DATE;
SELECT ORDER_DATE,
SHOP,
SALESPERSON,
LAST_VALUE(SALESPERSON) IGNORE NULLS OVER (PARTITION BY SHOP
ORDER BY ORDER_DATE RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LAST_VALUE_1,
LAST_VALUE(SALESPERSON) IGNORE NULLS OVER(PARTITION BY SHOP
ORDER BY ORDER_DATE ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS LAST_VALUE_2
FROM SALES ;
The correct set of results:
+---------------------+------+-------------+--------------------+
| ORDER_DATE | SHOP | SALESPERSON | SALESPERSON_FILLED |
+---------------------+------+-------------+--------------------+
| 14/04/2017 04:44:27 | A | MIKE | MIKE |
+---------------------+------+-------------+--------------------+
| 14/04/2017 04:44:55 | A | | MIKE |
+---------------------+------+-------------+--------------------+
| 14/04/2017 04:45:07 | A | TIM | TIM |
+---------------------+------+-------------+--------------------+
| 14/04/2017 04:45:30 | A | | TIM |
+---------------------+------+-------------+--------------------+
| 14/04/2017 04:45:43 | B | | |
+---------------------+------+-------------+--------------------+
| 14/04/2017 04:46:13 | B | JOHN | JOHN |
+---------------------+------+-------------+--------------------+
| 14/04/2017 04:46:28 | B | | JOHN |
+---------------------+------+-------------+--------------------+
| 14/04/2017 04:58:32 | C | | |
+---------------------+------+-------------+--------------------+
| 14/04/2017 04:58:41 | C | MELINDA | MELINDA |
+---------------------+------+-------------+--------------------+