2016-05-13 12 views
1

Ok, ich habe das auf jeder wo gesucht, aber kann keine Lösung bekommen.Inception mit LAG() in SQL

So habe ich eine Tabelle wie folgt aus:

member_id public_id 
a1  NULL 
a1  123 
a1  345 
a2  612 

Und ich möchte eine neue Spalte hinzuzufügen, mit dem Namen conv. Welche mit der Nummer mit dieser Regel gefüllt ist:

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 

Ich weiß, wie vorherige Zeile zuzugreifen, kann ich LAG() verwenden. Aber, wie man auf die vorherige Reihe von THAT Spalte zugreift, die auch LAG() darin benutzt.

Das ist mein Ziel:

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

Vielen Dank für Ihre Hilfe!


So, nachdem ich Ihre Lösung verwendet, bekam ich so ergeben:

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

Es ist, weil die Lösung conv+1 und conv 1 ist, so dass die maximale Anzahl wird immer 2

+0

Welche DBMS verwenden Sie? –

+0

@a_horse_with_no_name Impala – mthbnd

Antwort

0

Lag() akzeptiert einen Offset, so dass Sie mehr als einen Datensatz zurückgehen können. Ich kenne die genaue Syntax für Ihre Datenbank nicht, also hier ist die SQL Server-Version.

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

+0

Ja, aber ich möchte auf die vorherige Zeile (offset = 1) von _this_ Spalte ('conv' Spalte) zugreifen, die auch LAG() verwendet. – mthbnd

1

unter der Annahme, dass Sie Impalas verwenden

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

Ich dachte nicht daran, so eine weitere Kolumne zu machen. Das ist perfekt funktioniert. Vielen Dank! – mthbnd

+0

hi @ b1n0ys, Sie haben eine sehr intelligente Lösung, aber es kann immer noch nicht meine Frage beantworten. Ich denke, das ist meine Schuld, weil ich die Frage nicht richtig erklärt habe. Ich brauche immer noch deine Hilfe :) – mthbnd

+0

@mthbnd Abfrage sollte die gleiche Anzahl von Datensätzen wie die Quellentabelle zurückgeben. Der zweite und der dritte Datensatz in der Ergebnismenge sollten nicht vorhanden sein. – b1n0ys