我们说我有一系列可能重复的字符串
[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部分。
答案 0 :(得分:3)
使用COUNT
分析函数
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的数组的计数值。