我有一个包含不同报告日期的全局销售数据的表格,如下所示:
+------------+------+------------+---------+
| Closed | Open | Plan | Station |
+------------+------+------------+---------+
| 2018-10-23 | NULL | NULL | A |
| 2018-10-22 | NULL | NULL | NULL |
| 2018-10-22 | NULL | NULL | B |
| 2018-10-22 | NULL | NULL | NULL |
| NULL | NULL | 2018-10-23 | C |
| NULL | NULL | 2018-10-22 | NULL |
| NULL | NULL | 2018-10-22 | NULL |
+------------+------+------------+---------+
CREATE TABLE Orders
(Closed DATE,
Open DATE,
Plan DATE,
Station Char);
insert into Orders values ("2018-10-23",NULL,NULL, "A");
insert into Orders values ("2018-10-22",NULL,NULL, NULL);
insert into Orders values ("2018-10-22",NULL,NULL, "B");
insert into Orders values ("2018-10-22",NULL,NULL, NULL);
insert into Orders values (NULL,NULL,"2018-10-23", "C");
insert into Orders values (NULL,NULL,"2018-10-22", NULL);
insert into Orders values (NULL,NULL,"2018-10-22", NULL);
我想用最后知道的值填充站点列以获得以下所需的结果。
+------------+------+------------+---------+
| Closed | Open | Plan | Station |
+------------+------+------------+---------+
| 2018-10-23 | NULL | NULL | A |
| 2018-10-22 | NULL | NULL | A |
| 2018-10-22 | NULL | NULL | B |
| 2018-10-22 | NULL | NULL | B |
| NULL | NULL | 2018-10-23 | C |
| NULL | NULL | 2018-10-22 | C |
| NULL | NULL | 2018-10-22 | C |
+------------+------+------------+---------+
最佳答案
假设您的表中有一个主键列(假设id
),可用于定义Station
的“最后已知”值。 请记住,数据以无序方式存储,并且如果不定义特定顺序和/或主键,我们就无法真正定义“最后已知”值。
Coalesce()
函数将用于处理特定行中 Station
的 null
值。然后,我们可以使用Correlated Subquery确定“最后已知”值。
SELECT
t1.Closed,
t1.Open,
t1.Plan,
COALESCE(t1.Station,
(SELECT t2.Station
FROM Orders AS t2
WHERE t2.id < t1.id
AND t2.Station IS NOT NULL
ORDER BY t2.id DESC
LIMIT 1)) AS Station
FROM Orders AS t1
结果
| Closed | Open | Plan | Station |
| ---------- | ---- | ---------- | ------- |
| 2018-10-23 | | | A |
| 2018-10-22 | | | A |
| 2018-10-22 | | | B |
| 2018-10-22 | | | B |
| | | 2018-10-23 | C |
| | | 2018-10-22 | C |
| | | 2018-10-22 | C |
<小时/>
关于MySQL 5.5 - 用上面的值填补空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53265300/