2017-12-21 6 views
1

ich einige Tabellen mit Namen wie counts_20171220 in BigQuery mit Zeilen in diesem Format (es gibt nur eine Zeile pro contentId pro Tag):Collecting pro-Tag-Ergebnisse für Abfragen über datum partioned Tabellen

| contentId | views | 
+-----------+-------+ 
| cb32edc0 | 728324| 
| 52cbb1ff | 643220| 
... 

ich möchte für eine gegebenes contentId für einen bestimmten Zeitraum eine Liste der Ansicht Zählung erzeugen, ohne Lücken, zB:

|  date | views | 
+------------+--------+ 
| 2017-12-01 | NULL | -- or 0 
| 2017-12-02 | NULL | -- or 0 
| 2017-12-03 | 728314 | 
| 2017-12-04 | 328774 | 
| 2017-12-05 | 28242 | 
... 
| 2017-12-20 | NULL | -- or 0 

um dies zu tun, ich denke, ich * und _table_suffix verwenden müssen, aber ich bin kein a ble, um herauszufinden, wie man die Daten einfügt, für die contentId kein Eintrag ist. Der nächstgelegene ich bekam haben, ist diese Abfrage:

#standardSQL 
SELECT 
    _table_suffix AS date, 
    ARRAY_AGG(views) AS views 
FROM 
    `test.counts_*` 
WHERE 
    _table_suffix BETWEEN '20171201' AND '20171220' 
    AND contentId = 'cb32edc0' 
GROUP BY 
    _table_suffix, 
    contentId 
ORDER BY 
    date 

Das Problem bei dieser Abfrage ist

  1. es Zeilen enthält nicht für alle Termine, nur für Daten, deren Tabelle einen Eintrag für contentId ‚cb32edc0‘ hatte
  2. aufgrund der Art und Weise es strukturiert ist ich brauche eine (nutzlose hier) Aggregatfunktion zu verwenden, zu extrahieren views

Wie soll ich eine quer strukturieren Gefällt dir das? Ich würde glücklich sein, sowohl spezifische Hilfe für diese Abfrage als auch allgemeine Hinweise darauf zu erhalten, wie man Dinge wie diese erreicht, wenn man über date-partioned Tabellen abfragt.

Antwort

1

Dies sollte funktionieren, vorausgesetzt, dass es mindestens eine Zeile für jedes Datum ist:

SELECT 
    PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) AS date, 
    IFNULL(MAX(IF(contentId = 'cb32edc0', views, NULL)), 0) AS views 
FROM `test_counts_*` 
WHERE _TABLE_SUFFIX BETWEEN '20171201' AND '20171220' 
GROUP BY date; 

Statt explizit die Zeilen, die die gewünschten Filterung contentId nicht übereinstimmen, verwendet es einen Zustand mit einer Aggregatfunktion um sie vom Ergebnis auszuschließen. Wenn in der Gruppe mit der gewünschten contentId keine Zeilen vorhanden sind, stellt die IFNULL sicher, dass der Ausdruck 0 statt NULL zurückgibt.

+0

Danke! Das ist eigentlich ziemlich elegant! – beta

Verwandte Themen