2017-09-27 3 views
0

Ich habe eine Tabelle namens Programm die folgenden Spalten:HIVE: Finden laufenden Summen

 
ProgDate(Date) 
Episode(String) 
Impression_id(int) 
ProgName(String) 

Ich möchte für jedes Datum Gesamteindrücke, um herauszufinden, und Folge, für die ich die folgenden Abfrage haben, die feine

arbeitet
Select progdate, episode, count(distinct impression_id) Impression from Program where progname='BBC' group by progdate, episode order by progdate, episode; 
 
Result: 
ProgDate  Episode  Impression  
20160919  1  5   
20160920  1  15   
20160921  1  10   
20160922  1  5   
20160923  2  25   
20160924  2  10   
20160925  2  25   

Aber ich möchte auch für jede Episode, die kumulative Summe erfahren. Ich habe versucht, zu suchen, wie man laufende Summe findet, aber es addiert alle vorherigen Summen. i want laufende Summe für jede Folge, wie unten:

 
Date  Episode  Impression CumulativeImpressionsPerChannel  
20160919  1  5    5 
20160920  1  15    20 
20160921  1  10    30 
20160922  1  5    35 
20160923  2  25    25 
20160924  2  10    35 
20160925  2  25    60 

Antwort

0

Neuere Versionen von Hive HQL Unterstützung analytische Funktionen mit Fenster (ref 1) (ref 2) einschließlich SUM() OVER()

Angenommen, Sie eine solche Version haben ich habe die Syntax PostgreSQL bei SQL Fiddle

CREATE TABLE d 
    (ProgDate int, Episode int, Impression int) 
; 

INSERT INTO d 
    (ProgDate, Episode, Impression) 
VALUES 
    (20160919, 1, 5), 
    (20160920, 1, 15), 
    (20160921, 1, 10), 
    (20160922, 1, 5), 
    (20160923, 2, 25), 
    (20160924, 2, 10), 
    (20160925, 2, 25) 
; 
nachgeahmt

Abfrage 1:

select 
     ProgDate, Episode, Impression 
    , sum(Impression) over(partition by Episode order by ProgDate) CumImpsPerChannel 
    , sum(Impression) over(order by ProgDate) CumOverall 
from (
     Select progdate, episode, count(distinct impression_id) Impression 
     from Program 
     where progname='BBC' 
     group by progdate, episode order by progdate, episode 
    ) d 

Results:

| progdate | episode | impression | cumimpsperchannel | 
|----------|---------|------------|-------------------| 
| 20160919 |  1 |   5 |     5 | 
| 20160920 |  1 |   15 |    20 | 
| 20160921 |  1 |   10 |    30 | 
| 20160922 |  1 |   5 |    35 | 
| 20160923 |  2 |   25 |    25 | 
| 20160924 |  2 |   10 |    35 | 
| 20160925 |  2 |   25 |    60 | 
+0

Dank !. Ihre Antwort beantwortet perfekt mein Problem. Nur noch eine Abfrage, wie Sie die gesamte kumulative laufende Summe unabhängig von Datum oder Folge wie folgt erhalten: – Huzefa

+0

'| progdate | Folge | Eindruck | cumimpsperchannel | | ---------- | --------- | ------------ | -------------- ----- | | 20160919 | 1 | 5 | 5 | | 20160920 | 1 | 15 | 20 | | 20160921 | 1 | 10 | 30 | | 20160922 | 1 | 5 | 35 | | 20160923 | 2 | 25 | 60 | | 20160924 | 2 | 10 | 70 | | 20160925 | 2 | 25 | 95 | ' – Huzefa

+0

Entfernen Sie einfach den' partition by .... 'Teil innerhalb der OVER() Klausel, fügen Sie dies zur obigen Abfrage hinzu –