2017-12-08 1 views
1

Ich möchte Zeilen summieren, aber nur Werte enthalten, für die vor fünf Minuten ein Zeitstempel existiert. Ich benutze bigquery, die anscheinend keine timestamp_diff-Operation unterstützt (aber eine datediff).Zeilen von SQL-Operation ausschließen, wenn für einen früheren Zeitstempel kein Eintrag existiert

Betrachten Sie die folgenden Daten (mytable):

SELECT time, SUM(value) AS sumValue, COUNT(value) AS obs 
FROM mytable 
GROUP BY time 

Der Ausgang ist dann:

time     sumValue obs 
2013-07-03 07:50:00 7   2 
2013-07-03 07:55:00 7   2 
2013-07-03 08:00:00 7   2 
2013-07-03 08:05:00 3   1 
2013-07-03 08:10:00 7   2 

time (timestamp) meter (int) value (float) 
2013-07-03 07:50:00 1   3 
2013-07-03 07:50:00 2   4 
2013-07-03 07:55:00 1   3 
2013-07-03 07:55:00 2   4 
2013-07-03 08:00:00 1   3 
2013-07-03 08:00:00 2   4 
2013-07-03 08:05:00 1   3 
2013-07-03 08:10:00 1   3 
2013-07-03 08:10:00 2   4 

Die Abfrage Ich mag würde auf erweitern zuerst definiert werden als

Ich möchte, dass diese Abfrage erweitert wird, damit der Wert von meter 2 nicht in sumValue für 2013-07-03 08: 1 enthalten ist 0:00 (also sumValue hier = 3), weil es vor fünf Minuten keinen Eintrag mehr gab. Eine weitere Konsequenz davon ist, dass sumValue für den ersten Zeitstempel null wäre. Die gewünschte Ausgabe wäre dann:

time     sumValue obs 
2013-07-03 07:50:00 0   0 
2013-07-03 07:55:00 7   2 
2013-07-03 08:00:00 7   2 
2013-07-03 08:05:00 3   1 
2013-07-03 08:10:00 3   1 

Kann dies in bigquery getan werden?

Antwort

2

ist unten für BigQuery Standard-SQL

#standardSQL 
SELECT 
    time, 
    SUM(IF(delta = 300, value, 0)) sumValue, 
    COUNTIF(delta = 300) obs 
FROM (
    SELECT time, meter, value, 
    UNIX_SECONDS(time) - LAG(UNIX_SECONDS(time)) 
     OVER(PARTITION BY meter ORDER BY time) delta 
    FROM `project.dataset.table` 
) 
GROUP BY time 

Sie können oben mit Dummy-Daten aus Ihrer Frage mit Test/spielen

#standardSQL 
WITH `project.dataset.table` AS (
    SELECT TIMESTAMP '2013-07-03 07:50:00' time, 1 meter, 3 value UNION ALL 
    SELECT TIMESTAMP '2013-07-03 07:50:00', 2, 4 UNION ALL 
    SELECT TIMESTAMP '2013-07-03 07:55:00', 1, 3 UNION ALL 
    SELECT TIMESTAMP '2013-07-03 07:55:00', 2, 4 UNION ALL 
    SELECT TIMESTAMP '2013-07-03 08:00:00', 1, 3 UNION ALL 
    SELECT TIMESTAMP '2013-07-03 08:00:00', 2, 4 UNION ALL 
    SELECT TIMESTAMP '2013-07-03 08:05:00', 1, 3 UNION ALL 
    SELECT TIMESTAMP '2013-07-03 08:10:00', 1, 3 UNION ALL 
    SELECT TIMESTAMP '2013-07-03 08:10:00', 2, 4 
) 
SELECT 
    time, 
    SUM(IF(delta = 300, value, 0)) sumValue, 
    COUNTIF(delta = 300) obs 
FROM (
    SELECT time, meter, value, 
    UNIX_SECONDS(time) - LAG(UNIX_SECONDS(time)) 
     OVER(PARTITION BY meter ORDER BY time) delta 
    FROM `project.dataset.table` 
) 
GROUP BY time 
ORDER BY time 

Ergebnis ist

time      sumValue obs 
2013-07-03 07:50:00 UTC  0   0  
2013-07-03 07:55:00 UTC  7   2  
2013-07-03 08:00:00 UTC  7   2  
2013-07-03 08:05:00 UTC  3   1  
2013-07-03 08:10:00 UTC  3   1  
Verwandte Themen