Оконная функция PostgreSQL: группировка по столбцам без упорядочения (~ Python itertools.groupby) - PullRequest
1 голос
/ 21 февраля 2011

Мне нужно разделить таблицу в PostgreSQL на основе столбца, не сортируя и не делая результат уникальным;По сути, я пытаюсь воспроизвести поведение itertools.groupby() из Python в PostgreSQL.

Учитывая таблицу, содержащую два столбца:

1   C
2   C
3   C
4   C
5   C
6   C
7   C
8   C
9   C
10  S
11  E
12  E
13  E
14  E
15  E
16  C
17  C
18  C
19  C
20  E
21  E
22  E
23  E
24  E

Я хочу разделить ее по значениюво втором (при сохранении существующего порядка), чтобы закончить с этим:

1   C   1
2   C   1
3   C   1
4   C   1
5   C   1
6   C   1
7   C   1
8   C   1
9   C   1
10  S   2
11  E   3
12  E   3
13  E   3
14  E   3
15  E   3
16  C   4
17  C   4
18  C   4
19  C   4
20  E   5
21  E   5
22  E   5
23  E   5
24  E   5

Я попытался добиться этого с помощью оконных функций, используя комбинацию ROW_NUMBER() и LAG() для сравнения текущегострока с предыдущим, чтобы увидеть, если он изменился.Проблема в этом случае заключалась в том, что мне также понадобилась бы переменная, которая увеличивается каждый раз, когда значение изменяется.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Попробуйте это:

WITH T1 AS
(
    SELECT
        id,
        grp,
        LAG(grp) OVER (ORDER BY id) IS DISTINCT FROM grp AS changes
    FROM yourtable
)
SELECT id, grp, SUM(changes::int) OVER (ORDER BY id) FROM T1
1 голос
/ 21 февраля 2011

Хотя вы можете придумать решение, полностью основанное на оконных функциях, этот вид обработки набора результатов с сохранением состояния лучше всего подходит для итеративного подхода.Вот вопрос, который задавал нечто похожее раньше: Функция PostgreSQL для итерации / действия по многим строкам с состоянием

В основном подход только для окон сводится к созданию целочисленного столбца с«1» (или любое другое положительное целое число) в начале каждого раздела (например, где col2<>LAG(col2)), а затем с помощью другого агрегирования окон суммируйте эти групповые показатели от начала набора результатов до текущей строки.Это работает, просто уродливо и по сложности, и (я считаю) по производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...