【发布时间】:2012-02-20 21:30:18
【问题描述】:
我想创建一个窗口函数,该函数将计算当前行中字段的值出现在当前行之前的有序分区部分中出现的次数。为了更具体,假设我们有一个这样的表:
| id| fruit | date |
+---+--------+------+
| 1 | apple | 1 |
| 1 | cherry | 2 |
| 1 | apple | 3 |
| 1 | cherry | 4 |
| 2 | orange | 1 |
| 2 | grape | 2 |
| 2 | grape | 3 |
我们想创建一个像这样的表(为了清楚起见,省略了日期列):
| id| fruit | prior |
+---+--------+-------+
| 1 | apple | 0 |
| 1 | cherry | 0 |
| 1 | apple | 1 |
| 1 | cherry | 1 |
| 2 | orange | 0 |
| 2 | grape | 0 |
| 2 | grape | 1 |
请注意,对于id = 1,沿着有序分区移动,第一个条目“苹果”不匹配任何内容(因为隐含集合为空),下一个水果“樱桃”也不匹配。然后我们再次进入“apple”,这是一个匹配项,依此类推。我想象 SQL 看起来像这样:
SELECT
id, fruit,
<some kind of INTERSECT?> OVER (PARTITION BY id ORDER by date) AS prior
FROM fruit_table;
但我找不到任何看起来正确的东西。 FWIW,我使用的是 PostgreSQL 8.4。
【问题讨论】:
-
“日期”是否保证是连续的? (顺便说一句,“date”是保留字。“prior”在某些SQL实现中也是保留字)
标签: sql postgresql aggregate-functions window-functions