2017-10-24 8 views
0

Ich habe Tabelle wie folgt:Bienenstock Wie können die konditionsspezifischen Werte erhöht werden?

itm numbr 
1  2 
11  21 
NULL  31 
12  41 
NULL  51 
13  61 

i mit itm ausgegeben werden soll, numbr und mit extra Spalte, wie unten erwähnt:

itm  numbr incr 
    1  2  1 
    11  21  1 
    NULL  31  2 
    12  41  2 
    NULL  51  3 
    13  61  3 

die incr sollte nur seinen Wert erhöhen, wenn ITM gleich NULL sollte sonst den gleichen Wert wie vorheriger Wert anzeigen.

1. Ich habe mit row_sequence versucht

select itm,numbr,row_sequence() as incr from tablename; 

aber es zeigt 1,2,3,4,5,6.

2. dann habe ich versucht, mit

select itm,numbr,case when itm=NULL then row_sequence()+1 else row_sequence() end as incr from table; 

wirft Fehler "Fehler: Runtime org.apache.hadoop.hive.ql.metadata.HiveException: Stateful Ausdrücke können nicht innerhalb von CASE verwendet werden".

bitte beraten Sie mich. tia.

Antwort

1

Ungeprüfte aber analytische Funktion soll Ihnen helfen, als Wert der incr Spalte auf den Werten der anderen Zeilen abhängt:

WITH tmpincr as (
    SELECT 
     itm 
    , nmbr 
    -- get in tmpincr 1 for NULL, 0 for not null 
    , if(isnull(itm), 1, 0) as tmpincr 
    FROM tablename 
) 
SELECT 
    itm 
    , nmbr 
    -- get the sum of tmpincr for all rows before current one when ordered by itm 
    , SUM(tmpincr) OVER (
     ORDER BY nmbr 
     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 
    ) as incr 
    FROM tmpincr 
    ORDER BY nmbr 
; 
+0

dank @Guillaume. Ich erhalte die Ergebnisse als NULL 202 1, NULL 204 2, 100 200 2, 101 201 2, 103 203 2, 105 205 2, aber ich will nicht von der itm Spalte bestellen. –

+0

Sieht ganz in der Nähe aus! Ich habe vergessen, eine ORDER BY hinzuzufügen (Antwort aktualisiert, jetzt Bestellung von nmbr). Wenn Sie den NULL-Wert in einer bestimmten Reihenfolge zählen, ist eine Bestellklausel unbedingt erforderlich. – Guillaume

+0

das funktioniert gut. Vielen Dank –

0
UPDATE table_name 
SET incr = Coalesce(itm, 0) + 1 

Ich habe diese Lösung nicht versucht, aber das fügt 1 hinzu, wenn Null ist, ansonsten Inkrementnummer. Ändern es an Ihre Bedürfnisse anzupassen =)

Verwandte Themen