在PostgreSQL上使用DISTINCT ON计数发生次数以及结果

时间:2019-05-24 12:21:22

标签: json postgresql

我有这样的数据:

   [
    {"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

1 个答案:

答案 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