Я хочу создать оконную функцию, которая будет подсчитывать, сколько раз значение поля в текущей строке появляется в той части упорядоченного раздела, которая идет до текущей строки.Чтобы сделать это более конкретным, предположим, что у нас есть такая таблица:
| 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' также не соответствует.Затем мы снова получаем «яблоко», которое совпадает и так далее.Я представляю, что SQL выглядит примерно так:
SELECT
id, fruit,
<some kind of INTERSECT?> OVER (PARTITION BY id ORDER by date) AS prior
FROM fruit_table;
Но я не могу найти ничего, что выглядит правильно.FWIW, я использую PostgreSQL 8.4.