首页 > 解决方案 > 使用重叠组填充 SQL 表中的缺失数据

问题描述

我有一些分析数据,其中访问者的单个活动流是我们的网站,其中部分跟踪有一个 id,后来标识符是一个不同的值。如何使用 SQL 填充数据以使其完整。

 id1 | id2 |   timestamp 
-----+-----+---------------------
null |   3 |  123450 
null |   3 |  123451 
null |   3 |  123452 
   5 |   3 |  123453 
   5 |   3 |  123454 
   5 |null |  123455 
   5 |null |  123456 
   5 |null |  123457 
...
null |   8 |  123450 
null |   8 |  123451 
null |   8 |  123452 
   9 |   8 |  123453 
   9 |   8 |  123454 
   9 |null |  123455 
   9 |null |  123456 
   9 |null |  123457 
...

上面的两个部分属于同一组,我知道这是因为它们基本上在某些时候停止记录 id2。

我想要一个查询或 sql 和中间表,使我能够填充上面的空值,以便我拥有:

 id1 | id2 |   timestamp 
-----+-----+---------------------
   5 |   3 |  123450 
   5 |   3 |  123451 
   5 |   3 |  123452 
   5 |   3 |  123453 
   5 |   3 |  123454 
   5 |   3 |  123455 
   5 |   3 |  123456 
   5 |   3 |  123457 
...
   9 |   8 |  123450 
   9 |   8 |  123451 
   9 |   8 |  123452 
   9 |   8 |  123453 
   9 |   8 |  123454 
   9 |   8 |  123455 
   9 |   8 |  123456 
   9 |   8 |  123457 
...

标签: sqldatabasejoin

解决方案


假设会有一个id2对应一个id1非null,
只有一个id1对应一个id2非null

select a.id1, a.id2, b.timestamp
from  (
  select min(id1) id1, id2
  from tbl
  where id1 is not null and id2 is not null
  group by id2
) a right join tbl b
on (a.id1 = b.id1) OR (a.id2 = b.id2)

推荐阅读