Postgresql与常规和时间一样不需要

时间:2018-04-30 17:26:01

标签: arrays postgresql

我们说我有一系列可能重复的字符串

[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 :(得分:3)

使用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

<强> Results

| 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获取该特定id的数组的计数值。