sql - 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
?
我已经尝试了几个小时!我看过一些关于合并的帖子,但似乎并不适用。抱歉,这是微不足道的-我认为是,但我无法弄清楚。
解决方案
您可以使用窗口函数获取每行的有效值:
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
推荐阅读
- asp.net - 从控制器检索图像路径并传递给 HttpPostedFileBase 图像模型 ASP.Net MVC
- go - 尝试在 GCP App Engine 任务队列中安排任务时出现 InvalidTaskNameError
- laravel - Laravel:事务回滚后无法插入数据库
- c# - 如何为属性模态验证编写单元测试?
- flutter - 我可以从 Pub.dev 中删除、隐藏或重命名颤振包吗?
- c++ - 比较 SQLite for C++ 中的两个结果?
- c# - 如何为非 dbo 用户注册 SQL 表依赖项
- r - 如何根据不同的值对值进行汇总,然后聚合?
- javascript - 按数组中的标签对不同的字段进行排序
- amazon-web-services - 更正此 ElastiCache CloudFormation 模板所需的审核