MySQL 5.5-从上方填补空白

时间:2018-11-12 15:28:55

标签: mysql

我有一个表格,其中包含这样的不同报告日期的全球销售数据:

+------------+------+------------+---------+
| 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       |
+------------+------+------------+---------+

1 个答案:

答案 0 :(得分:1)

假设您的表中有一个主键列(例如id),该列可用于定义Station的“最新已知”值。 请记住:数据是以无序方式存储的,并且没有定义特定的顺序和/或主键,我们无法真正定义“最新已知”值。

Coalesce()函数将用于处理特定行中null的{​​{1}}值。然后,我们可以使用Correlated Subquery来确定“最新已知”值。

Station

结果

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

View on DB Fiddle