我有一張桌子items和一張桌子batches。一個批次可以有 n 個由 關聯的專案items.batch_id。
我想在兩組中撰寫一個查詢專案batched計數unbatched:
- items WHERE batch_id IS NOT NULL (batched)
- 專案 WHERE batch_id 為 NULL(未批處理)
結果應該是這樣的
| 分批 | 未分批 |
|---|---|
| 120萬 | 100 |
任何幫助表示贊賞,謝謝!
編輯:我堅持使用GROUP BY它原來是作業的錯誤工具。
uj5u.com熱心網友回復:
您可以使用COUNT`FILTER(WHERE)
它被稱為條件計數
CREATE TABLE items(item_id int, batch_id int)
CREATE TABLE
INSERT INTO items VALUEs(1,NULL),(2,NULL),(3,1)
INSERT 0 3
CREATE tABLe batch (batch_id int)
CREATE TABLE
select
count(*) filter (WHERE batch_id IS NOT NULL ) as "matched"
,
count(*) filter (WHERE batch_id IS NULL ) as "unmatched"
from items
| 匹配的 | 無與倫比 |
|---|---|
| 1 | 2 |
SELECT 1
小提琴
uj5u.com熱心網友回復:
該count()功能似乎是這里最有可能的基本工具。給定一個運算式,它回傳該運算式計算結果為非空的行數。給定引數*,它計算組中的所有行。
在某種程度上,有一個技巧,它是在同一結果行中獲得批處理和非批處理計數。至少有三種方法可以做到這一點:
- 使用子查詢:
select
(select count(batch_id) from items) as batched,
(select count(*) from items where batch_id is null) as unbatched
-- no FROM
這很簡單。每個子查詢都被執行并產生一列結果。因為FROM在外部查詢中沒有給出子句,所以只有一個結果行。
- 使用視窗函式:
select
count(batch_id) over () as batched,
(count(*) over () - count(batch_id) over ()) as unbatched
from items
limit 1
這將在每個結果行上計算整個表的batched和結果,表的每行一個,但實際上只回傳一個結果行。有理由希望(盡管您肯定想測驗)postgres 實際上并沒有計算該子句剔除的所有行的這些計數。例如,您可以將此選項的性能與前一個選項的性能進行比較。unbatcheditemslimit
- 使用
count()withfilter子句,如另一個答案中詳細描述的那樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530964.html
標籤:PostgreSQL
