【发布时间】:2016-02-11 07:18:23
【问题描述】:
我想对我的数据库(PostgreSQL v9.4.5)提出一个特殊要求,但我没能做到。
为了简单起见,假设我有下表AvgTemperatures,代表不同城市的不同平均温度,并以不同的时间长度计算(以月计):
id | city | avg | months
----+-----------+------+--------
1 | New-York | 20 | 3 <--- average temperate over the last 3 months
2 | New-York | 19 | 6 <--- average temperate over the last 6 months
3 | New-York | 15 | 12 <--- etc
4 | New-York | 15 | 24
5 | Boston | 13 | 3
6 | Boston | 18 | 8
7 | Boston | 17 | 12
8 | Boston | 16 | 15
9 | Chicago | 12 | 2
10 | Chicago | 14 | 12
11 | Miami | 28 | 1
12 | Miami | 25 | 4
13 | Miami | 21 | 12
14 | Miami | 22 | 15
15 | Miami | 20 | 24
现在,假设我想在至少有一个平均温度超过 19 度的城市中选择与度量相关的所有行。在这种情况下,我想要:
id | city | avg | months
----+-----------+------+--------
1 | New-York | 20 | 3
2 | New-York | 19 | 6
3 | New-York | 15 | 12
4 | New-York | 15 | 24
11 | Miami | 28 | 1
12 | Miami | 25 | 4
13 | Miami | 21 | 12
14 | Miami | 22 | 15
15 | Miami | 20 | 24
我可以这样做:
SELECT *
FROM AvgTemperatures
WHERE MIN(avg) OVER (PARTITION BY city) > 16
但是:
********** Erreur **********
ERROR: window functions not allowed in WHERE clause
而且,我不能使用GROUP BY :
SELECT *
FROM AvtTemperatures
GROUP BY city
HAVING MIN(avg) > 16
因为我会因为聚合而丢失信息(顺便说一下,这个查询因为“SELECT *”而无效)。
我很确定我可以使用OVER PARTITION BY 来解决这个问题,但我不知道该怎么做。有人有想法吗?
【问题讨论】:
标签: sql postgresql window-functions