【发布时间】:2017-09-10 08:51:03
【问题描述】:
我想从我的数据集中填充缺失的空值。我有一个这样的数据集
+---------------------+------+-------------+
| 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 |
+---------------------+------+-------------+
我喜欢使用商店中空值之前的第一个找到的值填充按商店划分的销售人员信息。我试过这个,但这不会产生正确的结果(如下)。如何解决?
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,
/*tried two approaches*/
/*does not produce a correct result set*/
LAST_VALUE(SALESPERSON) IGNORE NULLS OVER (PARTITION BY SHOP
ORDER BY ORDER_DATE RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LAST_VALUE_1,
/*this also does not solve this*/
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 ;
正确的结果集是:
+---------------------+------+-------------+--------------------+
| 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 |
+---------------------+------+-------------+--------------------+
【问题讨论】:
-
你能否也包括正确的结果是什么?
-
@TimBiegeleisen 添加了正确的结果集
-
我不知道如何解决这个问题,但我赞成你的问题。如果你能坐稳,像@GordonLinoff 这样的人希望能给你一个答案。
标签: sql oracle oracle11g null oracle12c