2015-08-09 40 views
1

我使用PostgreSQL,我有以下情況:是否可以在相同的查詢中創建和使用窗口函數?

Sales

(短版):

stock
itemid quantity 
    5  10 
    5  12 
    6  1 

(短版):

itemid stock 
5  30 
6   1 

我有一個複雜的查詢,也需要在其中的一列中顯示每個itemidSUM

所以這將是:

Select other things,itemid,stock, SUM (quantity) OVER (PARTITION BY itemid) AS total_sales 
from ..... 
    sales 
    stock 

該查詢確定。然而,這個查詢將呈現:

itemid stock total_sales 
    5  30  22 
    6  1  1 

但我並不需要看到itemid=6因爲整個股票被出售。這意味着我需要一個WHERE條件,如:

WHERE total_sales<stock 

,但我不能這樣做,因爲total_salesWHERE後創建完成。

有沒有辦法解決這個問題,而沒有圍繞整個查詢與另一個?如果可以的話,我儘量避免。

+0

使用派生表(也就是你所說的「*周圍的查詢與另一個*」的技術術語)是隻有這樣解決這個問題。你爲什麼要避免它? –

+0

這只是我的問題的一個簡單的例子......在我的情況下,我有4列依賴於其他窗口函數的結果...所以它將是4派生表... – John

+0

我不明白爲什麼會這樣做四個派生表 - 只有一個(或CTE)有四個別名。您應該發佈**完整**查詢。 –

回答

2

您可以使用子查詢或CTE:

select s.* 
from (Select other things,itemid,stock, 
      SUM(quantity) OVER (PARTITION BY itemid) AS total_sales 
     from ..... 
    ) s 
where total_sales < stock; 

不能使用在SELECT定義的表的別名在SELECTWHERE,或FROM條款爲SELECT。但是,子查詢或CTE可以解決這個限制。

0

您還可以使用內選擇您的WHERE聲明是這樣的:

SELECT *, SUM (quantity) OVER (PARTITION BY itemid) AS total_sales 
FROM t 
WHERE quantity <> (SELECT SUM(quantity) FROM t ti WHERE t.itemid = ti.itemid); 
+0

派生表的解決方案將快得多。 –

相關問題