2016-04-27 32 views
1

以下查詢是默認值(在本例中爲INTEGER(21))與計算值(在此示例中爲COUNT(*))混合的示例。爲什麼count(*)返回一個無符號整數?

SELECT 
    dimension, 
    SUM(metric) 
FROM (
    SELECT 
    "dim1" AS dimension, 
    INTEGER(21) AS metric), 
    (
    SELECT 
    dimension, 
    COUNT(*) AS metric 
    FROM (
    SELECT 
     "dim2" AS dimension, 
     INTEGER(42) AS metric) 
    GROUP BY 
    dimension) 
GROUP BY 
    dimension 

運行此查詢時,它被拒絕,出現以下錯誤信息:

無法工會表:不兼容的類型。 'metric':TYPE_INT64'metric':TYPE_UINT64

換句話說,count操作返回一個無符號整數,而手動創建的整數是帶符號的。我理解count操作的下層邏輯,顯然它總是返回一個大於或等於0的整數。這同樣可以通過將COUNT(*)封裝在第11行的INTEGER構造函數中來避免我的示例查詢。我猜我真正的問題是:爲什麼COUNT(*)返回一個無符號整數而不是一個有符號整數(這將允許更清晰和更簡單的查詢,就像在其他類似SQL的環境中一樣)?

回答

3

使COUNT返回無符號整數類型只是一個不幸的錯誤,特別是因爲BigQuery甚至不支持其元數據中的無符號整數。但是這個(以及其他許多問題)通過BigQuery中的標準SQL支持得到修復,BigQuery可以用作Alpha。有關如何啓用它的詳細信息,請查看https://cloud.google.com/bigquery/sql-reference/enabling-standard-sql

0

有幾個原因,使用一個unsigned int是有利的:

  • 哲學:正如你所說,COUNT不能返回負數,只有natural numbers,這是無符號整數設計爲代表。這是工作的正確工具。
  • 範圍:無符號整數可以存儲大約兩倍於非整數的非負值。這大大降低了表示函數輸出時變量溢出的可能性。
  • 類型安全:通過使用不能表示無效數據的類型,它會阻止用戶嘗試進行無效比較。如果您嘗試將COUNT的輸出與負數進行比較,則分析儀可以立即告訴您,您正在進行的比較沒有意義,並且很可能是錯誤的,因此可能會使您免於惱人的錯誤。
+0

我完全不同意您的迴應,但我主要關心的是這是一個未記錄的功能/錯誤,它很難調試,並且使其他SQL環境變得更加困難。 –

0

如果您正在進行計數,則不可能有負數。因此,通過將其設置爲無符號整數,可以處理的數字範圍將擴大。

+0

鑑於整數已經在64位,我認爲這對大多數人來說不是對COUNT(*)操作的限制。 –

相關問題