2013-02-02 13 views
6

Każdy pomysł, jak obliczyć sumę bieżącą w SQL BigQuery?Łącza SQL z BigQuery łącznie

id value running total 
-- ----- ------------- 
1 1  1 
2 2  3 
3 4  7 
4 7  14 
5 9  23 
6 12  35 
7 13  48 
8 16  64 
9 22  86 
10 42  128 
11 57  185 
12 58  243 
13 59  302 
14 60  362 

Nie jest to problem dla tradycyjnych serwerów SQL przy użyciu skorelowanej zapytanie skalarnego:

SELECT a.id, a.value, (SELECT SUM(b.value) 
         FROM RunTotalTestData b 
         WHERE b.id <= a.id) 
FROM RunTotalTestData a 
ORDER BY a.id; 

lub dołączenia:

SELECT a.id, a.value, SUM(b.Value) 
FROM RunTotalTestData a, 
     RunTotalTestData b 
WHERE b.id <= a.id 
GROUP BY a.id, a.value 
ORDER BY a.id; 

Ale nie mogłem znaleźć sposób, aby to działało w BigQuery ...

Odpowiedz

2

Prawdopodobnie już to rozgryzłeś. Ale tutaj jest jeden, nie najskuteczniejszy sposób:

JOIN można wykonać tylko za pomocą porównań równości, np. B.id < = nie można użyć a.id.

https://developers.google.com/bigquery/docs/query-reference#joins

Jest to dość kiepski jeśli chodzi o mnie. Ale jest jedna praca wokół. Po prostu użyj porównania równości dla jakiejś sztucznej wartości, aby uzyskać produkt kartezjański, a następnie użyj GDZIE dla < =. Jest to szalenie nieoptymalne. Ale jeśli twoje stoły są małe, to zadziała.

SELECT a.id, SUM(a.value) as rt 
FROM RunTotalTestData a 
JOIN RunTotalTestData b ON a.dummy = b.dummy 
WHERE b.id <= a.id 
GROUP BY a.id 
ORDER BY rt 

Można ręcznie ograniczyć czas, a także:

SELECT a.id, SUM(a.value) as rt 
FROM (
    SELECT id, timestamp RunTotalTestData 
    WHERE timestamp >= foo 
    AND timestamp < bar 
) AS a 
JOIN (
    SELECT id, timestamp, value RunTotalTestData 
    WHERE timestamp >= foo AND timestamp < bar 
) b ON a.dummy = b.dummy 
WHERE b.id <= a.id 
GROUP BY a.id 
ORDER BY rt 

Aktualizacja:

Nie trzeba specjalnej własności. Możesz po prostu użyć

SELECT 1 AS one 

i dołączyć do tego.

Podczas naliczania opłat liczona jest tabela łączenia.

+0

wielkie dzięki, te zapytania działają! – Sasa

+0

Aktualizacja 2013: możesz użyć funkcji SUM() OVER() dla prostszego zapytania http://stackoverflow.com/questions/14664578/bigquery-sql-running-totals/20480827#20480827 –

1

Problem polega na drugim zapytaniu, że BigQuery będzie UNION 2 tabele w FROM expressio n.

Nie jestem pewien co do pierwszego, ale jest możliwe, że bigquery nie lubi podselekty w wyrażeniach Select, tylko w FromExpression. Musisz więc przenieść podkwerendę do odexpression i połączyć wyniki.

Ponadto, można spróbować naszego sterownika JDBC: Starschema BigQuery JDBC Driver

Wystarczy po prostu załadować je do Squirrel SQL lub RazorSQL lub kinda dowolnego narzędzia, które obsługuje sterowniki JDBC, upewnij się włączyć Transformer Query poprzez ustawienie:

transformQuery = true

we właściwościach lub w url JDBC, każdy informacji można znaleźć na stronie projektu. Po wykonaniu tej czynności spróbuj uruchomić drugie zapytanie, zostanie przekształcone w łączenie kompatybilne z BigQuery.

+0

można dać przykład zapytania BigQuery? Nie widzę możliwości przeniesienia podselekcji z SELECT na FROM, ponieważ odwołuje się do B? I nie możesz połączyć się z <=. czego mi brakuje? –

+0

dzięki za wskazówki - ale bez powodzenia ze sterownikiem jdbc BQ (i SquirrelSQL) - zawsze pojawia się błąd (sqlState: null, errorCode: 0). – Sasa

+0

@ AlenVrečko Jeśli włączysz rejestrowanie, z poziomem ustawionym podczas debugowania, wyloguje on również przeanalizowane zapytania. Zrobiliśmy nasz parser, aby był kompatybilny z narzędziami do raportowania, z tego powodu zbudowaliśmy gramatykę ANTLR od 0, i akceptujemy tylko podzapytania na FROM. [Przykłady można znaleźć tutaj] (http://code.google.com/p/starschema-bigquery-jdbc/wiki/QueryTransformationEngine) –

19

Aktualizacja 2013: Możesz użyć SUM() OVER(), aby obliczyć sumy bieżące.

W przykładzie:

SELECT id, value, SUM(value) OVER(ORDER BY id) 
FROM [your.table] 

przykład roboczych:

SELECT word, word_count, SUM(word_count) OVER(ORDER BY word) 
FROM [publicdata:samples.shakespeare] 
WHERE corpus = 'hamlet' 
AND word > 'a' LIMIT 30; 
+0

To może być bardzo przydatne w finansowym Monte Symulacje Carlo, w których potrzebujemy skumulowanych sum drobnych odchyleń losowych, aby zasymulować ścieżkę ceny. – Paul

+0

Ta składnia działa również w standardowym języku SQL. Zobacz dokumentację funkcji analitycznych. https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#analytic-functions –