Postgresql

選擇帶有 where 子句的計數問題

  • September 21, 2016

我有一個初始表,其中包含以下行:ID_0、geom 和 utilisatio(其中值從 1 到 7 不等)。

我正在嘗試創建一個表,我將在其中計算 400m 範圍內的每個 ID_0 的特定使用率值(與 ID_0 相關聯)。到目前為止,我想出了:

Select a.id_0, a.geom, count (b.utilisatio) as util_1
into new_table
from first_table as a 
   left join first_table as b ON ST_Dwithin (a.geom, b.geom, 400)
where a.id_0 <> b.id_0
group by a.id_0, a.geom
;

現在我的問題是我實際上不知道在哪裡添加以下約束以僅獲取指定的使用程式碼:

where utilisatio = 1

我是 Postgres 的初學者自學成才的使用者,所以如果這個問題是基本的,我很抱歉。

與往常一樣,該文件是一個很好的參考。在這裡,它顯示WHERE condition並且條件被定義(在頁面下方)為

其中 condition 是任何計算結果為 boolean 類型的表達式。任何不滿足此條件的行都將從輸出中刪除。如果在實際行值替換任何變數引用時返回 true,則該行滿足條件。

HAVING,正如約翰在評論中指出的那樣,用於在計算聚合後過濾聚合,而WHERE用於過濾在開始時收集的行。例如:

SELECT
 type, COUNT(type)
FROM table
GROUP BY type
HAVING COUNT(type) > 1

將返回一組行,其中 COUNT(type) 結果最終大於 1。在數據庫已經按 TYPE 對整個表進行分組併計算了所有值之後HAVING,將進行過濾。另一方面COUNT()

SELECT
 type, COUNT(type)
FROM table
WHERE type = 'EXAMPLE'
GROUP BY type

將返回一行(其中類型為EXAMPLE)以及包含該類型的行數。此處的過濾發生在數據庫預先收集行時.. 任何不具有“範例”類型的行都將被丟棄。在這種情況下只計算一個 COUNT()。

一個更複雜的範例表明兩者是分開評估的,並且可以在任何查詢中組合。

SELECT
 col_1, col_2, col_3, SUM(col_4), COUNT(col_4), AVG(col_4)
FROM table
WHERE col_2 IN ('A', 'B', 'C')
 AND col_3 > 3
GROUP BY col_1, col_2, col_3
HAVING COUNT(col_4) > 2
 AND AVG(col_4) > 10.5

引用自:https://dba.stackexchange.com/questions/150172