2016-08-30 3 views
0

In einer Hive-Tabelle habe ich tatsächliche Verkäufe und Prognosen für sie. so dass die Daten wie folgt aussehen:Operation über gruppierte Spalte Hive

item date salesDol salesUnit predictionU 
1 1/1/2016 5.99  1   0.9 
1 1/1/2016 5.49  1   0.9 
1 2/1/2016 5.99  1   0.84 
1 3/1/2016 6.04  1   0.92 

Für den Durchschnittspreis der Berechnung ich tun:

create table data1 as 
select item, date, predictionU from data 
JOIN 
(select sum(salesDol) as totDol, sum(salesUnit) as totUnit from data); 

Also in jeder Zeile Ich habe totDol und totUnit. Um nun endgültig hochgerechneten Verkaufseinheiten zu erhalten Ich versuche:

create table data2 as 
    select item, date, sum(predictionU)*totDol/totUnit from data1 group by item, date; 

dann bekomme ich Fehler sagen:

FAILED: SemanticException [Error 10025]: Expression nicht in GROUP BY-Taste 'totDol'

Ich bin nicht in der Lage zu verstehen, warum Hive mich dazu auffordert, totDol auch in der Gruppenklausel aufzunehmen. Irgendein Vorschlag.

Antwort

2

Nur Fensterfunktionen verwenden:

select item, date, predictionU, 
     sum(salesDol) over() as totDol, 
     sum(salesUnit) over() as totUnit 
from data; 

Sie können dann enthalten diese in Ihrer letzten Abfrage:

select item, date, predictionU, 
     sum(salesDol) over() as totDol, 
     sum(salesUnit) over() as totUnit, 
     (preditionU * sum(salesDol) over()/sum(salesUnit) over()) 
from data; 
+0

ich vereinfachte Version der meine Abfrage gefragt. Wenn ich 'sum (case wenn sls_type_c = 'regulär', dann tot_sales else 0 end) als regulär_sls 'habe, dann muss ich einfach' sum (tot_sales) über (partition by sls_type_c = 'regulär') als regulary_sls' ausführen. richtig? @abhiieor – abhiieor

+0

Nein, Sie würden 'sum (Fall, wenn sls_type_c = 'regulär' dann tot_sales sonst 0 Ende) über()' für die Summe aller "regulären" Verkäufe. –

Verwandte Themen