MySQL 5.5 - 用上面的值填补空白

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

最佳答案

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

Coalesce()函数将用于处理特定行中 Stationnull 值。然后,我们可以使用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       |
<小时/>

View on DB Fiddle

关于MySQL 5.5 - 用上面的值填补空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53265300/

相关文章:

mysql - Delphi中从SQL表接收数据

mysql - sql中如何对多列进行分组

php - 从mysql中选择多行并指定一列的总和

mysql - 细化mysql查询结果的结果

mysql - 字符 "ي"和 "ی"和波斯语的区别 - Mysql

mysql - 如何使用分页版本控制检索 MySQL 表行

php - MySQL 将变量绑定(bind)到 PHP - 时间戳精度丢失

php - 我的 id=x 只是显示所有内容?

php - 如何从 'MySQL Create Table' 查询字符串中获取列名?

mysql - 如何选择并插入没有重复值的新表?