2013-02-02 26 views
6

BigQuery SQL'de çalışan toplamı nasıl hesaplayacağınız hakkında bir fikriniz var mı?BigQuery SQL toplamları çalıştırılıyor

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 

Değil bağıntılı skaler sorgusu kullanarak geleneksel SQL sunucularının bir sorun: Ama bunun çalışması için bir yol bulamadı

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; 

:

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

veya katılmak BigQuery ...

cevap

2

Muhtemelen bunu zaten çözdünüz. Ama burada en etkili olanı değil:

JOIN sadece eşitlik karşılaştırmaları kullanılarak yapılabilir, yani b. Bana sorarsan

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

Bu oldukça sıkıcı. Ama etrafta bir iş var. Sadece kartezyen ürün almak için bazı kukla değerde eşitlik karşılaştırması kullanın ve sonra < = için WHERE kullanın =. Bu çirkin suboptimal. Ama eğer masaların küçükse, bu işe yarayacak.

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 

elle de zaman kısıtlayabilir:

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 

Güncelleme:

Özel bir özellik gerekmez.

SELECT 1 AS one 

'u kullanabilir ve buna katılabilirsiniz.

Faturalama giderken, birleştirme tablosu işlemede sayar.

+0

çok teşekkürler, bu sorgular işe yarıyor! – Sasa

+0

2013 güncelleştirmesi: daha basit bir sorgu için SUM() OVER() kullanabilirsiniz http://stackoverflow.com/questions/14664578/bigquery-sql-running-totals/20480827#20480827 –

1

Sorun, ikinci sorguda, BigQuery FROM ifadesinde 2 tablo UNION olacak n.

Birincisi hakkında emin değilim, ancak bigquery'nin Select ifadelerinde yalnızca ForExpression'da alt seçimleri sevmemesi olasıdır. Bu yüzden alt sorgusu fromexpress'e taşımanız ve sonuçları bir araya getirmeniz gerekiyor. Ayrıca

, bizim JDBC sürücüsünün bir deneyin verebilir: Starschema BigQuery JDBC Driver

Sadece basit Sorgu Transformer açmak emin olun Sincap SQL veya razorsql veya JDBC sürücüleri destekleyen tür herhangi bir araç içine yüklemek ayarlayarak:

özelliklerinde veya JDBC url gerçek

transformQuery = her bilgi proje sayfasından bulunabilir. Bunu yaptıktan sonra 2. sorguyu çalıştırmayı deneyin, BigQuery uyumlu bir birleştirmeye dönüştürülecektir.

+0

Toplu Veri Sorgulama sorgusunun örnek verebilir misiniz? Subselect'i SELECT'ten FROM'a B referansı olarak nasıl taşıyabileceğinizi göremiyorum? Ve JOIN ON olamaz <=. Neyi kaçırıyorum? –

+0

ipuçları için teşekkürler - ama BQ jdbc sürücüsü (ve SquirrelSQL) ile hiçbir şans - her zaman hata alıyorum (sqlState: null, errorCode: 0). – Sasa

+0

@ AlenVrečko Günlüğe kaydetmeyi etkinleştirdiyseniz, hata ayıklama düzeyinde ayarlanmış olarak, ayrıştırılmış sorguları da günlüğe kaydeder. Ayrıştırıcımızın Raporlama araçlarıyla uyumlu olmasını sağladık. Çünkü, 0'dan bir ANTLR dilbilgisi oluşturduk ve yalnızca FROM'daki alt sorguları kabul ediyoruz. [Örnekler burada bulunabilir] (http://code.google.com/p/starschema-bigquery-jdbc/wiki/QueryTransformationEngine) –

19

2013 güncelleştirmesi: Çalışan toplamları hesaplamak için SUM() OVER() öğesini kullanabilirsiniz.Örnekte

:

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

Bir çalışma örneği:

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

Bu gerçekten de mali olarak çok yararlı olabilir Bir fiyat yolunu simüle etmek için küçük rastgele sapmaların birikimli toplamlarına ihtiyaç duyduğumuz karlo simülasyonları. – Paul

+0

Bu sözdizimi standart SQL'de de çalışır. Analitik fonksiyonlar ile ilgili belgelere bakınız. https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#analytic-functions –