2016-04-28 3 views
1

Ich habe versucht, eine meiner MSSQL-Abfragen in BigQuerys neuer SQL-Standardfunktion zu verwenden, da hierfür spezielle JOIN-Bedingungen erforderlich sind. Die Referenz enthält jedoch keine Erläuterungen zu den Datums- und Zeitfunktionen in BigQuery's Standard-SQL.Datums- und Uhrzeitfunktionen in BigQuery's Standard-SQL

Bisher konnte ich meine DATE_ADD Aussagen konvertieren aus: DATE_ADD ('2015.01.01', -13, 'Monat') zu: DATE_ADD ('2015.01.01', INTERVAL -13 MONAT)

Ich konvertierte auch YEAR (x) in EXTRACT (JAHR VON x). Beide scheinen MySQL-ähnliche Aussagen zu sein.

Schließlich habe ich bemerkt, dass die Ausgabe der meisten Datumsfunktionen mit TIMESTAMP konvertiert werden muss, bevor Sie sie vergleichen können.

Aber jetzt, dass meine Abfrage schließlich ausgeführt werden soll, erhalte ich einen "Interner Fehler". Wer weiß, was könnte falsch sein? Dies ist die Abfrage:

SELECT 
    M, 
    Bought12MBeforeM, 
    Bought12MBeforeAndInM, 
    (Bought12MBeforeAndInM * 1.0)/(Bought12MBeforeAndInM + Bought12MBeforeM) AS RepurchaseRate 
FROM (
    SELECT 
    M, 
    COUNT(DISTINCT CASE WHEN MaxM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeM, 
    COUNT(DISTINCT CASE WHEN MaxM >= TIMESTAMP(M) 
     AND MinM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeAndInM 
    FROM (
    SELECT 
     M, 
     user_id, 
     MAX(cart_creation_date) AS MaxM, 
     MIN(cart_creation_date) AS MinM 
    FROM (
     SELECT 
     user_id, 
     cart_creation_date 
     FROM 
     `vex-eu-cloud-sql-001.work_user.flat_orders` 
     WHERE 
     cart_creation_date >= TIMESTAMP(DATE_ADD('2015-01-01', INTERVAL -13 MONTH)) 
     GROUP BY 
     user_id, 
     cart_creation_date) UniqueCarts 
    INNER JOIN (
     SELECT 
     DATE(Day) AS M 
     FROM 
     `vex-custom.wouter.days_2007_2020` 
     WHERE 
     EXTRACT(YEAR 
     FROM 
      Day) >= 2015 
     AND EXTRACT(DAY 
     FROM 
      Day) = 1 
     AND Day < TIMESTAMP(CURRENT_DATE())) Months 
    ON 
     cart_creation_date > TIMESTAMP(DATE_ADD(M, INTERVAL -13 MONTH)) 
     AND cart_creation_date < TIMESTAMP(DATE_ADD(M, INTERVAL 1 MONTH)) 
    GROUP BY 
     M, 
     user_id) BoughtInM 
    GROUP BY 
    M) Results 
+0

Wenn Sie Job-ID liefern, ich nachschlagen kann, was die Interner Fehler –

+0

Hallo Mosha verursacht, es ist ** vex-production: bquijob_343984cc_1545ef2e7a4 ** – Wouter

+0

OK, ich habe die Antwort aktualisiert, nachdem ich diesen Fehler untersucht habe. –

Antwort

1

Der Fehler ist aufgrund eines Fehlers Handhabung Zeitstempel in der WHERE-Klausel in SQL-Standard. Die aktuelle Problemumgehung es mit UNIX_MICROS Funktion zu wickeln ist von TIMESTAMP zu INT64 zu übersetzen, dann Ihre Abfrage funktioniert:

SELECT 
    M, 
    Bought12MBeforeM, 
    Bought12MBeforeAndInM, 
    (Bought12MBeforeAndInM * 1.0)/(Bought12MBeforeAndInM + Bought12MBeforeM) AS RepurchaseRate 
FROM (
    SELECT 
    M, 
    COUNT(DISTINCT CASE WHEN MaxM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeM, 
    COUNT(DISTINCT CASE WHEN MaxM >= TIMESTAMP(M) 
     AND MinM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeAndInM 
    FROM (
    SELECT 
     M, 
     user_id, 
     MAX(cart_creation_date) AS MaxM, 
     MIN(cart_creation_date) AS MinM 
    FROM (
     SELECT 
     user_id, 
     cart_creation_date 
     FROM 
     `vex-eu-cloud-sql-001.work_user.flat_orders` 
     WHERE 
     UNIX_MICROS(cart_creation_date) >= UNIX_MICROS(TIMESTAMP(DATE_ADD('2015-01-01', INTERVAL -13 MONTH))) 
     GROUP BY 
     user_id, 
     cart_creation_date) UniqueCarts 
    INNER JOIN (
     SELECT 
     DATE(Day) AS M 
     FROM 
     `vex-custom.wouter.days_2007_2020` 
     WHERE 
     EXTRACT(YEAR FROM Day) >= 2015 
     AND EXTRACT(DAY FROM Day) = 1 
     AND UNIX_MICROS(Day) < UNIX_MICROS(TIMESTAMP(CURRENT_DATE()))) Months 
    ON 
     cart_creation_date > TIMESTAMP(DATE_ADD(M, INTERVAL -13 MONTH)) 
     AND cart_creation_date < TIMESTAMP(DATE_ADD(M, INTERVAL 1 MONTH)) 
    GROUP BY 
     M, 
     user_id) BoughtInM 
    GROUP BY 
    M) Results 
+0

OK, habe das versucht, habe aber folgendes: _Error: TIMESTAMP_ADD unterstützt das MONTH date part_ – Wouter

+0

Die Referenz erwähnt YEAR, DAY und andere Datumsteilfunktionen. Aber all diese geben mir: _Error: Funktion nicht gefunden: YEAR_ – Wouter

+0

Ich werde die Dokumentation aktualisieren, um zu verdeutlichen, dass Datumsteile wie YEAR und DAY innerhalb der EXTRACT-Funktion verwendet werden sollen. –