2016-05-13 21 views
1

好吧,我已经在每一处都搜索了这个,但无法获得解决方案。Inception在SQL中使用LAG()

所以我有这样的一个表:

member_id public_id 
a1  NULL 
a1  123 
a1  345 
a2  612 

而且我想添加一个新列,命名为conv。这是用这个规则填充数字:

IF PREVIOUSROW(member_id) <> member_id THEN 1 
ELSE IF PREVIOUSROW(member_id) = member_id AND PREVIOUSROW(public_id) = NULL 
    THEN PREVIOUSROW(THIS_COLUMN) + 1 <-- here is the inception 
ELSE 1 

我知道如何访问上一行,我可以使用LAG()。但是,如何访问THAT列中的前一行,该列中也使用了LAG()

这是我的目标:

member_id public_id conv 
a1  NULL  1 
a1  NULL  2 
a1  NULL  3 
a1  123  4 
a1  345  1 
a2  612  1 

谢谢您的帮助!


所以,我用您的解决方案后,我得到这样的:

member_id public_id conv 
a1  NULL  1 
a1  NULL  2 
a1  NULL  2 
a1  123  2 
a1  345  1 
a2  612  1 

这是因为该解决方案是conv+1conv是1,所以最大数量将永远2

+0

您正在使用哪个数据库管理系统? –

+0

@a_horse_with_no_name Impala – mthbnd

回答

0

Lag()接受一个偏移量,以便您可以返回多条记录。我不知道数据库的确切语法,因此这里是SQL Server版本。

https://msdn.microsoft.com/en-us/library/hh231256.aspx

+0

是的,但我想从_this_列('conv'列)访问前一行(偏移量= 1),它也使用LAG()。 – mthbnd

1

假设你正在使用黑斑羚

select 
     member_id 
    , public_id 
    , case when (prev_member_id = member_id) and prev_public_id is NULL 
      then conv + 1 
      else conv 
     end as conv  
from ( 
    select 
      member_id 
     , public_id 
     , lag(member_id) over(partition by member_id order by public_id asc nulls first) as prev_member_id 
     , lag(public_id) over(partition by member_id order by public_id asc nulls first) as prev_public_id 
     , 1 as conv 
    from z_test1 
)temp 
order by member_id, public_id asc nulls first; 
+0

我并没有想这样做另一个列。这是完美的。谢谢! – mthbnd

+0

hi @ b1n0ys,你有一个非常聪明的解决方案,但它仍然无法回答我的问题。我认为这是我的错,因为没有正确解释问题。我仍然需要你的帮助:) – mthbnd

+0

@mthbnd查询应该返回与源表相同数量的记录。结果集中的第2和第3条记录不应该在那里。 – b1n0ys