Postgresql Unnest с порядком, а также раз видел - PullRequest
0 голосов
/ 30 апреля 2018

Допустим, у меня есть массив потенциально дублированных строк

[a,a,b,c,a,b,c,d]

Я бы хотел отменить развертывание этого массива, чтобы я мог получить индекс, а также подсчет того, сколько раз этот элемент уже был не вложен в массив. Все мои массивы относительно короткие (25 элементов или меньше).

Мой ожидаемый результат будет:

element, idx, times_seen a, 1, 1 a, 2, 2 b, 3, 1 c, 4, 1 a, 5, 3 b, 6, 2 c, 7, 2 d, 8, 1

Первые два бита я могу сделать довольно легко left join lateral unnest(arr) with ordinality as a(element, idx) , но я бы тоже хотел сыграть в Times_seen.

1 Ответ

0 голосов
/ 30 апреля 2018

использование COUNT аналитическая функция

SQL Fiddle

Настройка схемы PostgreSQL 9.6 :

CREATE TABLE t
    (arr TEXT[])
;

INSERT  
    INTO t (arr)
         VALUES ('{a,a,b,c,a,b,c,d}'::TEXT[])
;

Запрос 1 :

SELECT element
    ,idx
    ,COUNT(element) OVER (
        PARTITION BY element ORDER BY idx
        ) AS times_seen
FROM t
    ,unnest(arr) WITH ordinality AS a(element, idx)
ORDER BY idx

Результаты

| element | idx | times_seen |
|---------|-----|------------|
|       a |   1 |          1 |
|       a |   2 |          2 |
|       b |   3 |          1 |
|       c |   4 |          1 |
|       a |   5 |          3 |
|       b |   6 |          2 |
|       c |   7 |          2 |
|       d |   8 |          1 |

Если вы можете иметь несколько строк, содержащих массивы, и иметь столбец ID для каждого массива, вы можете использовать

PARTITION BY ID,element, чтобы получить значения счетчика для массива с этим конкретным идентификатором.

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