2016-03-21 12 views
3

Ich habe eine Tabelle in BigQuery, die wie folgt aussieht:Mit Lücken und Inseln finden aufeinanderfolgende Stunden/Dates- SQL/BigQuery

Caller_Number | month | day| call_time 
--------------|--------|-----|---------- 
1    | 5  | 15 | 12:56:17 

ich eine SQL-Abfrage für BigQuery schreiben wollen, der mir erlaubt zu zählen die aufeinanderfolgenden Stunden, in denen mindestens ein Anruf getätigt wurde (nach Anrufernummer sortiert), und die aufeinanderfolgenden Tage, an denen mindestens 10 aufeinanderfolgende Stunden mit Anrufen aufgetreten sind (Sortierer nach Anrufernummer). Ich habe mir die vorhandenen Ressourcen zu Lücken und Inseln angeschaut, aber ich habe keine Ahnung, wie ich sie auf aufeinanderfolgende Daten und Stunden anwenden kann.

+0

"nach Anrufernummer" sortiert macht obige Frage ziemlich unscharf. Sie sollten mehr Details angeben. Vielleicht möchten Sie das Beispiel des erwarteten Ergebnisses teilen. nicht "nach caller_number" oder "partitioned by caller_number" zu haben würde es völlig differentnet klar story –

+0

Okay, würde das Beispiel Ergebnis wie folgt aussehen: Caller_Number | Monat | Tag Num_Consec_Hours Die zweite Probe Ergebnis würde wie folgt aussehen: Caller_Number | Monat | Num_Consec_Days – argunaw

Antwort

2

unten Arbeitsbeispiel für aufeinanderfolgende Stunden
Schritte sind
1. „Extract“ Stunde von call_time

HOUR(TIMESTAMP(CURRENT_DATE() + ' ' + call_time)) 

2.Suchen Vorherige Stunde

LAG([hour]) OVER(PARTITION BY Caller_Number, [month], [day] ORDER BY [hour]) 

3.Calculate Start der Gruppe von aufeinanderfolgenden Stunden - 1 - Start, 0 - Gruppenfortsetzung

IFNULL(INTEGER([hour] - prev_hour > 1), 1) 

4.Assign Gruppennummer an jede Gruppe

SUM(seq) OVER(PARTITION BY Caller_Number, [month], [day] ORDER BY [hour]) 

5.Und schließlich - Gruppe durch Gruppennummer und zählen Anrufe und Stunden

Hope this Sie guten Start gibt an aufeinanderfolgenden Tagen eine ähnliche Logik für die Implementierung für top of consec Stunden Ergebnis

SELECT Caller_Number, [month], [day], seq_group, 
    EXACT_COUNT_DISTINCT([hour]) AS hours_count, COUNT(1) AS calls_count 
FROM (
    SELECT Caller_Number, [month], [day], [hour], 
    SUM(seq) OVER(PARTITION BY Caller_Number, [month], [day] 
        ORDER BY [hour]) AS seq_group 
    FROM (
    SELECT Caller_Number, [month], [day], [hour], 
     IFNULL(INTEGER([hour] - prev_hour > 1), 1) AS seq 
    FROM (
     SELECT Caller_Number, [month], [day], [hour], 
     LAG([hour]) OVER(PARTITION BY Caller_Number, [month], [day] 
         ORDER BY [hour]) AS prev_hour 
     FROM (
     SELECT Caller_Number, [month], [day], 
      HOUR(TIMESTAMP(CURRENT_DATE() + ' ' + call_time)) AS [hour] 
     FROM YourTable 
    ) 
    ) 
) 
) 
GROUP BY Caller_Number, [month], [day], seq_group 
Verwandte Themen