2017-05-02 68 views

回答

1

這可以利用窗口函數

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; 

根據不同的指標,你的內存配置和表格定義可能會比兩個窗口函數更快。

0

不,不可能做什麼被問到,sql不會以這種方式工作,第二個要求計數()sql會將數據的級別更改爲聚合。做你所要求的唯一方法是做一個計數()並在單獨的查詢中排序。

+1

這是可能的。 –

+0

是的,我知道這可以在使用窗口功能的嵌套查詢中完成,但根據問題,我認爲用戶需要單行類型的查詢(對於大數據集也是計算上的),嵌套查詢將執行比兩個單獨的查詢 – Satyadev

+1

您如何知道單個查詢會執行較慢?你測試過了嗎?兩個窗口函數都可以由數據庫在單個查詢中進行評估 - 通常是Postgres中的Seq掃描。通過兩次查詢,您可以看到兩次Seq掃描,這是兩倍的工作量。 –

0

使用窗函數和子查詢沒有另一種解決方案:

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定義的組定義的分區。

我沒有進行任何測試,但我懷疑我的解決方案是其中包括三個已經發布的效果較差。但它也是迄今爲止最接近您的示例查詢。

相關問題