我有有23條記錄表,我試圖讓記錄和最後一個記錄的總數也在單一的查詢。類似的東西可以得到TOTALCOUNT和最後一個記錄和PostgreSQL
select count(*) ,(m order by createdDate) from music m ;
有沒有什麼辦法可以將這個只有最後一條記錄以及PostgreSQL的總數拉出來。
我有有23條記錄表,我試圖讓記錄和最後一個記錄的總數也在單一的查詢。類似的東西可以得到TOTALCOUNT和最後一個記錄和PostgreSQL
select count(*) ,(m order by createdDate) from music m ;
有沒有什麼辦法可以將這個只有最後一條記錄以及PostgreSQL的總數拉出來。
這可以利用窗口函數
select *
from (
select m.*,
row_number() over (order by createddate desc) as rn,
count(*) over() as total_count
from music
) t
where rn = 1;
另一種選擇是使用標量子查詢,並用limit
條款結合起來做:
select *,
(select count(*) from order_test.orders) as total_count
from music
order by createddate desc
limit 1;
根據不同的指標,你的內存配置和表格定義可能會比兩個窗口函數更快。
不,不可能做什麼被問到,sql不會以這種方式工作,第二個要求計數()sql會將數據的級別更改爲聚合。做你所要求的唯一方法是做一個計數()並在單獨的查詢中排序。
使用窗函數和子查詢沒有另一種解決方案:
SELECT DISTINCT count(*) OVER w, last_value(m) OVER w
FROM music m
WINDOW w AS (ORDER BY date DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING);
這裏的要點是,LAST_VALUE適用於Windows和不通過GROUP BY定義的組定義的分區。
我沒有進行任何測試,但我懷疑我的解決方案是其中包括三個已經發布的效果較差。但它也是迄今爲止最接近您的示例查詢。
這是可能的。 –
是的,我知道這可以在使用窗口功能的嵌套查詢中完成,但根據問題,我認爲用戶需要單行類型的查詢(對於大數據集也是計算上的),嵌套查詢將執行比兩個單獨的查詢 – Satyadev
您如何知道單個查詢會執行較慢?你測試過了嗎?兩個窗口函數都可以由數據庫在單個查詢中進行評估 - 通常是Postgres中的Seq掃描。通過兩次查詢,您可以看到兩次Seq掃描,這是兩倍的工作量。 –