是否可以在同一查询中创建和使用窗口函数?

时间:2015-08-09 13:09:15

标签: sql postgresql

我正在使用PostgreSQL,我遇到以下情况:

Sales表(简短版):

itemid quantity
  5      10
  5      12
  6       1

stock表(简短版):

itemid stock
5        30
6         1

我有一个复杂的查询,还需要在其中一个列中显示每个SUM的{​​{1}}。

所以它会是:

itemid

此查询没问题。但是这个查询会出现:

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_sales,我无法做到这一点。

有没有办法解决这个问题而不用另一个查询包围整个查询?如果可以的话,我试图避免它。

2 个答案:

答案 0 :(得分: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;

您不能在SELECTSELECTWHERE条款中使用FROM中定义的表别名来SELECT。但是,子查询或CTE会绕过此限制。

答案 1 :(得分: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);