arrays - 具有序数和时间的 Postgresql 不嵌套
问题描述
假设我有一个可能重复的字符串数组
[a,a,b,c,a,b,c,d]
我想取消嵌套数组,以便我可以获得索引,以及计算该元素已经在数组中取消嵌套的次数。我所有的数组都相对较短(25 个元素或更少)。
我的预期输出是:
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 部分。
解决方案
使用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
结果:
| 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 的数组的计数值。
推荐阅读
- python - 每当有人尝试从 Python 中的特定文件夹复制任何文件时如何记录日志
- python - 从用 hydra.main() 修饰的函数返回配置
- swift - 如何用 PHPickerViewController 中的图像替换 livePhoto?
- python-3.x - Python pre-order to postfix notation reverse Polish notation
- python - 如何使用 BeautifulSoup 获取多个 div 下的 div 元素?
- c# - 从包含数组的对象列表中返回不同的列表
- javascript - 带有 Laravel 8 的 SurveyJs 没有 Larvel-surveyjs 包
- c++ - 如何获取 char 数组 char* 的长度
- next.js - Nextjs Auth0 在 getServerSideProps 中获取数据
- lambda-calculus - 减少这个 lambda 表达式