2017-12-05 4 views
2

Ich habe eine einfache Tabelle wie unten mit vielen IDs und Daten.Zählen Sie einzigartige IDs in einem rollenden Zeitrahmen

ID  Date 
10R46 2014-11-23 
10R46 2016-04-11 
100R9 2016-12-21 
10R91 2013-05-03 
...  ... 

Ich mag eine Abfrage formulieren, die für einen Walzzeitrahmen von Daten, um die eindeutige IDs zählt zehn Tage zum Beispiel. Das bedeutet, dass es für jedes Datum die Anzahl der eindeutigen IDs zwischen diesem Datum und 10 Tagen zurück geben sollte. Das Ergebnis sollte ungefähr so ​​aussehen.

UniqueTenDays Date 
200    2014-11-23 
324    2014-11-24 
522    2014-11-25 
532    2014-11-26 
...    ... 

Etwas nach dem Vorbild des Balgs aber ich merke, ich brauche die WHERE-Klausel anzuwenden und die IDs für jedes Datum irgendwie zu zählen.

SELECT Date, COUNT(DISTINCT ID) 
FROM T 
WHERE Date BETWEEN DATE_SUB(Date, INTERVAL 10 DAY) AND Date 
GROUP BY Date 
ORDER BY Date 

Vielen Dank im Voraus.

Antwort

1

Below für ist BigQuery Standard-SQL

#standardSQL 
WITH temp1 AS (
    SELECT dt, STRING_AGG(DISTINCT id) AS users 
    FROM `project.dataset.yourtable` 
    GROUP BY dt 
), temp2 AS (
    SELECT 
    dt, 
    STRING_AGG(users) OVER(ORDER BY UNIX_DATE(dt) RANGE BETWEEN 10 PRECEDING AND CURRENT ROW) users 
    FROM temp1 
) 
SELECT dt, 
    (SELECT COUNT(DISTINCT id) FROM UNNEST(SPLIT(users)) AS id) UniqueTenDays 
FROM temp2 

Sie können damit testen/spielen mit Dummy-Daten, wie unten

#standardSQL 
WITH `project.dataset.yourtable` AS (
    SELECT '10R46' id, DATE '2014-11-23' dt UNION ALL 
    SELECT '10R46',  DATE '2016-04-11' UNION ALL 
    SELECT '10R46',  DATE '2016-04-12' UNION ALL 
    SELECT '10R47',  DATE '2016-04-13' UNION ALL 
    SELECT '10R48',  DATE '2016-04-14' UNION ALL 
    SELECT '100R9',  DATE '2016-12-21' UNION ALL 
    SELECT '10R91',  DATE '2013-05-03' 
), temp1 AS (
    SELECT dt, STRING_AGG(DISTINCT id) AS users 
    FROM `project.dataset.yourtable` 
    GROUP BY dt 
), temp2 AS (
    SELECT 
    dt, 
    STRING_AGG(users) OVER(ORDER BY UNIX_DATE(dt) RANGE BETWEEN 10 PRECEDING AND CURRENT ROW) users 
    FROM temp1 
) 
SELECT dt, 
    (SELECT COUNT(DISTINCT id) FROM UNNEST(SPLIT(users)) AS id) UniqueTenDays 
FROM temp2 
+0

Ihnen sehr Mikhail danken, das funktioniert großartig. Du hast mir definitiv eine Menge neuer Konzepte vorgestellt, die ich in der letzten Stunde gelesen habe, aber alles macht Sinn. – ErikK

Verwandte Themen