使用重叠组填充SQL表中缺少的数据

使用重叠组填充SQL表中缺少的数据,sql,database,join,Sql,Database,Join,我有一些分析数据,其中访客的单个活动流是一个网站,其中部分跟踪有一个id,稍后标识符是一个不同的值。如何使用SQL填充数据以使其完整 id1 | id2 | timestamp -----+-----+--------------------- null | 3 | 123450 null | 3 | 123451 null | 3 | 123452 5 | 3 | 123453 5 | 3 | 123454 5 |null |

我有一些分析数据,其中访客的单个活动流是一个网站,其中部分跟踪有一个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 
...

假设除了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)

如果我们假设
id1
id2
以唯一的对出现,并且每个id都不具有任何其他值,那么您可以简单地使用窗口函数:

select coalesce(id1, max(id1) over (partition by id2)) as id1,
       coalesce(id2, max(id2) over (partition by id1)) as id2,
       timestamp
from t;
如果没有这一假设,问题的形式就不好,也没有具体的答案


是dbfiddle

a.id1=b.id1 | | a.id2=b.id2
是无效的标准SQL。此外:将两个id值连在一起并没有什么意义。@horse\u带有\u no\u名称,您能解释一下为什么它无效吗。。。这是因为id(s)hva空值…因为您实际上拥有
其中expression1=expression2=expression3
。若有的话,您需要在括号之间放置一对表达式,例如
(expression1=expression2)=expression3
,但
expression3
必须是
boolean
值(其中
id2
最有可能不是)