2013-02-02 37 views
6

Bất kỳ ý tưởng nào về cách tính tổng số chạy trong BigQuery SQL?Tổng số chạy SQL BigQuery

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 

Không phải là một vấn đề đối với các máy chủ SQL truyền thống bằng cách sử dụng tương quan truy vấn vô hướng:

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

hoặc tham gia:

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; 

Nhưng tôi không thể tìm thấy một cách để làm cho nó hoạt động trong BigQuery ...

Trả lời

2

Có thể bạn đã tìm ra. Nhưng đây là một cách không hiệu quả nhất:

THAM GIA chỉ có thể thực hiện bằng cách so sánh bình đẳng, tức là b.id < = a.id không thể sử dụng được.

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

Điều này khá là xấu nếu bạn hỏi tôi. Nhưng có một công việc xung quanh. Chỉ cần sử dụng so sánh bình đẳng trên một số giá trị giả để có được sản phẩm Descartes và sau đó sử dụng WHERE cho < =. Điều này là cực kỳ tối ưu. Nhưng nếu các bảng của bạn nhỏ thì nó sẽ hoạt động.

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 

Bạn có thể tự hạn chế thời gian cũng như:

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 

Cập nhật:

Bạn không cần một tài sản đặc biệt. Bạn chỉ có thể sử dụng

SELECT 1 AS one 

và tham gia vào đó.

Khi thanh toán, bảng tổng hợp sẽ được tính trong quá trình xử lý.

+0

cảm ơn rất nhiều, các truy vấn này hoạt động! – Sasa

+0

2013 cập nhật: bạn có thể sử dụng hàm SUM() OVER() cho truy vấn đơn giản hơn http://stackoverflow.com/questions/14664578/bigquery-sql-running-totals/20480827#20480827 –

1

Vấn đề là với truy vấn thứ hai, BigQuery sẽ UNION 2 bảng trong biểu thức FROM n.

Tôi không chắc chắn về điều đầu tiên, nhưng có khả năng là truy vấn lớn không thích các lựa chọn con tại các biểu thức Chọn, chỉ tại FromExpression. Vì vậy, bạn cần phải di chuyển truy vấn phụ vào biểu thức từ, và JOIN kết quả.

Ngoài ra, bạn có thể cung cấp cho nó một thử để điều khiển JDBC của chúng tôi: Starschema BigQuery JDBC Driver

Đơn giản chỉ cần tải nó vào Squirrel SQL, hoặc RazorSQL hoặc kinda bất kỳ công cụ nào hỗ trợ trình điều khiển JDBC, hãy chắc chắn bạn bật Transformer Query bằng cách thiết lập:

transformQuery = true

trong các thuộc tính hoặc trong url JDBC, mỗi thông tin có thể được tìm thấy tại trang của dự án. Sau khi bạn đã làm điều này, hãy thử chạy truy vấn thứ 2, nó sẽ được chuyển thành một tham gia tương thích BigQuery.

+0

Bạn có thể cho ví dụ về truy vấn BigQuery? Tôi không thể thấy làm thế nào bạn có thể di chuyển subselect từ SELECT để FROM vì nó tham chiếu B? Và bạn không thể JOIN ON <=. Tôi đang thiếu gì? –

+0

cảm ơn các gợi ý - nhưng không may mắn với trình điều khiển jdbc BQ (và SquirrelSQL) - luôn nhận được lỗi (sqlState: null, errorCode: 0). – Sasa

+0

@ AlenVrečko Nếu bạn bật tính năng ghi nhật ký, với cấp được đặt trên gỡ lỗi, nó cũng sẽ ghi lại các truy vấn được phân tích cú pháp. Chúng tôi đã làm cho trình phân tích cú pháp của chúng tôi tương thích với các công cụ báo cáo, do đó chúng tôi đã xây dựng một ngữ pháp ANTLR từ 0 và nó chỉ chấp nhận các truy vấn con tại FROM. [Ví dụ có thể được tìm thấy tại đây] (http://code.google.com/p/starschema-bigquery-jdbc/wiki/QueryTransformationEngine) –

19

Cập nhật 2013: Bạn có thể sử dụng hàm SUM() OVER() để tính tổng số lần chạy.

Trong ví dụ của bạn:

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

Một ví dụ làm việc:

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

Điều này thực sự có thể rất hữu ích trong tài chính monte mô phỏng carlo nơi chúng ta cần tổng tích lũy của các độ lệch ngẫu nhiên nhỏ để mô phỏng đường giá. – Paul

+0

Cú pháp này cũng hoạt động trong SQL chuẩn. Xem tài liệu về chức năng phân tích. https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#analytic-functions –

Các vấn đề liên quan