2016-05-13 40 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

相關問題