我有这样的数据:
[
{"name": "pratha", "email": "p@g.com", "sub": { "id": 1 } },
{"name": "john", "email": "x@x.com", "sub": { "id": 5 } },
{"name": "pratha", "email": "c@d.com", "sub": { "id": 2 } }
]
这是我的查询,以获取唯一和最新的电子邮件:
SELECT DISTINCT ON (jae.e->>'name')
jae.e->>'name' as name,
jae.e->>'email' as email
FROM survey_results sr
CROSS JOIN LATERAL jsonb_array_elements(sr.data_field) jae (e)
ORDER BY jae.e->>'name', jae.e->'sub'->>'id' desc
问题是,当我添加count(*)
进行选择时,所有计数都是相等的。
我想获得与众不同的独特结果,并计算它们的出现次数。因此,在这种情况下,pratha
应该是 2 ,而john
应该是 1
与他们的数据(不只是计数)
如何用PostgreSQL实现呢?
参见此处:https://dbfiddle.uk/?rdbms=postgres_11&fiddle=f5c640958c3e4d594287632d0f4a835f
答案 0 :(得分:1)
您需要这个吗?
SELECT DISTINCT ON (jj->>'name') jj->>'name', jj->>'email' , count(*) over(partition by jj->>'name' )
from survey_results
join lateral jsonb_array_elements(data_field) j(jj) on true
ORDER BY jj->>'name', jj->'sub'->>'id' desc
https://dbfiddle.uk/?rdbms=postgres_11&fiddle=5f07b7bcb0001ebe32aa2f1338d9d0f0