我想创建一个窗口函数,该函数将计算当前行中字段的值出现在当前行之前的有序分区部分中的次数。为了使这个更具体,假设我们有一个像这样的表:
| 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' 不匹配任何内容(因为隐含集合为空),下一个水果 'cherry' 也不匹配。然后我们再次进入“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。