2016-06-09 9 views
0

So habe ich eine Abfrage in BQ, die als solche aussieht:BigQuery MAX() -Funktion

SELECT 
    SubscriptionId, 
    start_time, 
STRFTIME_UTC_USEC((UTC_USEC_TO_MONTH(TIMESTAMP_TO_USEC(TIMESTAMP(start_time)))),'%B %Y') AS cohort_month, 
    UTC_USEC_TO_MONTH(start_time) AS usec_month, 
    STRFTIME_UTC_USEC((UTC_USEC_TO_WEEK(TIMESTAMP_TO_USEC(TIMESTAMP(start_time)), 0)),'%Y-%m-%d') AS cohort_week, 
    WEEK(start_time) AS usec_week, 
    DATE(start_time) AS cohort_day, 
    UTC_USEC_TO_DAY(start_time) AS usec_day, 
    amount, 
    current_period_start, 
    current_period_end, 
    cancel_date, 
    end_date, 
    cancel_at_period_end, 
    salesRepEmail, 
    CASE WHEN (salesRepEmail IS NOT NULL) THEN 'Telesales' ELSE 'Online' END AS sales_channel, 
    status, 
    type_id, 
    CASE WHEN (type_id IN ('150032', 
     '150033', 
     '150023')) THEN 'Annual' ELSE 'Monthly' END AS duration, 
    refunded 
FROM 
    [data_snapshots_daily.subs_charges_refunds_] 
WHERE 
    start_time >= '2016-04-01 00:00:00' 
    AND refunded = FALSE 

Was wenn ich bin auf der Suche zu tun, um die Abfrage Add-on ist so, dass es alle gibt die relevanten Daten aus dem letzten Monat, der letzten Woche und dem letzten Tag.

Also stelle ich mir vor, dass es etwas mit MAX zu tun hat (usec_month), aber ich kann es nicht herausfinden. Denken Sie daran, ich will es nur relevante Daten zurückzugeben, wenn es in dem letzten Monat (Juni)

Antwort

1

ich denke, wie für aktuellen Monat unter

von etwas enthalten ist

WHERE YEAR(CURRENT_DATE()) = YEAR(start_time) 
AND MONTH(CURRENT_DATE()) = MONTH(start_time) 

für aktuelle Woche

WHERE YEAR(CURRENT_DATE()) = YEAR(start_time) 
AND WEEK(CURRENT_DATE()) = WEEK(start_time) 

für aktuellen Tag

WHERE CURRENT_DATE() = DATE(start_time) 

schnell

für die letzten zwei Wochen in mit etwas spielen, wie unten (soll verbessert werden erste Woche des Jahres zu handhaben)

WHERE (YEAR(CURRENT_DATE()) = YEAR(start_time) AND WEEK(CURRENT_DATE()) = WEEK(start_time)) 
OR CASE WHEN WEEK(CURRENT_DATE()) = 1 
     THEN (YEAR(CURRENT_DATE()) - 1 = YEAR(start_time) AND 53 = WEEK(start_time)) 
     ELSE (YEAR(CURRENT_DATE()) = YEAR(start_time) AND WEEK(CURRENT_DATE()) - 1 = WEEK(start_time)) 
    END 

Aufteilung der obigen Aussage (pro Ihrem Anfrage)

Es wird nach Startzeit gesucht, die entweder zur aktuellen oder zur vorherigen Woche gehören. Die aktuelle Woche ist einfach. Im Fall der vorherigen Woche sieht es so aus, wenn die aktuelle Woche nicht die erste Woche des Jahres ist - in diesem Fall ist die Bedingung - das gleiche Jahr, aber die vorherige Woche. Und falls die aktuelle Woche die erste Woche des Jahres ist, wird die letzte Woche des vorherigen Jahres gesucht.

sauberere Version last two weeks Zustand

DATE(start_time)>DATE(DATE_ADD(CURRENT_DATE(),-7*1-DAYOFWEEK(CURRENT_DATE()),'DAY')) 

Wechsel 1 in 7*1 zu handhaben zu der 3 sagen wir mal - Sie werden für last four weeks zum Beispiel

+0

Das war sehr hilfreich geben konditionieren, aber ich habe habe eine Folgefrage bekommen. Was, wenn ich in der letzten Woche noch hinzufügen wollte? Also im Grunde gibt es die aktuellen Wochen Daten und die vorherigen Wochen zurück? – wizkids121

+0

siehe "quick add" in Antwort –

+0

Gearbeitet! Vielen Dank! Obwohl ich immer noch ein bisschen verwirrt über die CASE-Anweisung bin. Könnten Sie aufschlüsseln, was genau passiert? – wizkids121