首页 > 解决方案 > SQL - 从匹配的行中返回最新内容的合并行

问题描述

我想不通 - 我想这很简单,但我找不到合适的方法。

我相信它被称为“最后一个非空难题”,但我无法在线遵循解决方案!目前我正在使用 PHP 来解析返回的数组,直到变量全部填满,但我更喜欢在 SQL 中进行。在 Ubuntu 上使用 MariaDB 8。

随着记录的添加,ID 会增加。它可能是一个日期时间。

如果我有以下情况:

ID | Data1 | Data2 | Data3
1  | NULL  | Book  | NULL
2  | Pink  | NULL  | Cat
3  | NULL  | Book  | NULL
4  | Blue  | NULL  | NULL
5  | NULL  | Stool | Cat
6  | White | NULL  | NULL
7  | NULL  | NULL  | Bull

我将如何返回:(White | Stool | Bull最近的“非空值”)?

有没有办法选择id = '4'并返回Blue | Book | Cat

我已经尝试了几个小时!我看过一些关于合并的帖子,但似乎并不适用。抱歉,这是微不足道的-我认为是,但我无法弄清楚。

标签: sqlmariadb

解决方案


您可以使用窗口函数获取每行的有效值:

select t.*,
       max(data1) over (partition by grp1) as imputed_data1,
       max(data2) over (partition by grp2) as imputed_data2,
       max(data3) over (partition by grp3) as imputed_data3
from (select t.*,
             count(data1) over (order by id) as grp1,
             count(data2) over (order by id) as grp2,
             count(data3) over (order by id) as grp3
      from t
     ) t;

然后,您可以通过将其用作子查询或 CTE 来查看所有id或某些s 或最后一行的值。id


推荐阅读