PostgreSQL 查询数组中不同元素的聚合计数
PostgreSQL query for an aggregate count of distinct elements within an array
我想计算跨多行的字符串数组中每个唯一标记的总出现次数,并将其全部作为 PostgreSQL 查询的一部分进行计算。
我正在使用 Prisma,但我怀疑如果可能的话,我必须通过 $queryRaw
来完成此操作。
在我的 schema.prisma
中,allTags
设置为字符串数组:
allTags String[]
这在数据库模式中变成了 _text
,下划线似乎意味着它是一个数组:
"allTags" _text,
假设数据如下:
allTags
------------------------------
{JavaScript, Vue.js}
{JavaScript, Node}
{TypeScript, JavaScript, Node}
...输出应如下所示:
count + tag
------------------
3 | JavaScript
2 | Node
1 | Vue.js
1 | TypeScript
我的预感是我可能需要在这里以某种方式使用子查询(我已经看到提到 LATERAL
),但我不能完全拼凑起来。
可能是对数组取消嵌套的横向连接。
select count(*) as "count", tag
from your_table t
cross join lateral unnest(allTags) as tags(tag)
group by tag
order by 1 desc;
count
tag
3
JavaScript
2
Node
1
Vue.js
1
TypeScript
演示 db<>fiddle here
我想计算跨多行的字符串数组中每个唯一标记的总出现次数,并将其全部作为 PostgreSQL 查询的一部分进行计算。
我正在使用 Prisma,但我怀疑如果可能的话,我必须通过 $queryRaw
来完成此操作。
在我的 schema.prisma
中,allTags
设置为字符串数组:
allTags String[]
这在数据库模式中变成了 _text
,下划线似乎意味着它是一个数组:
"allTags" _text,
假设数据如下:
allTags
------------------------------
{JavaScript, Vue.js}
{JavaScript, Node}
{TypeScript, JavaScript, Node}
...输出应如下所示:
count + tag
------------------
3 | JavaScript
2 | Node
1 | Vue.js
1 | TypeScript
我的预感是我可能需要在这里以某种方式使用子查询(我已经看到提到 LATERAL
),但我不能完全拼凑起来。
可能是对数组取消嵌套的横向连接。
select count(*) as "count", tag
from your_table t
cross join lateral unnest(allTags) as tags(tag)
group by tag
order by 1 desc;
count | tag |
---|---|
3 | JavaScript |
2 | Node |
1 | Vue.js |
1 | TypeScript |
演示 db<>fiddle here