在PostgreSQL上使用CROSS JOIN LATERAL将具有多个字段的Json数组数据分组

时间:2019-05-24 00:33:14

标签: json postgresql

这是jsonb字段数据:

[
   {'name': 'pratha', 'email': 'p@g.com', 'sub': { 'id': 1 } },
   {'name': 'pratha', 'email': 'c@d.com', 'sub': { 'id': 2 } }
]

当我想获取nameemail字段时,我得到重复的字段

这是查询:

SELECT jae.e->>'name', jae.e->>'email'
       FROM survey_results sr
            CROSS JOIN LATERAL jsonb_array_elements(sr.data_field) jae (e)
            GROUP BY jae.e->>'name', jae.e->>'email'

在此数据中,两个对象的name均为pratha,但电子邮件有所不同。我要抢的是一个pratha和最新的email数组。

有可能吗?

实际结果:

pratha    p@g.com
pratha    c@d.com

预期结果:

pratha    c@d.com

我只需要名称和电子邮件字段,因此,我想按名称对它们进行分组。

参见此处:http://sqlfiddle.com/#!17/9b55f/2

1 个答案:

答案 0 :(得分:1)

您尚未解释“最新电子邮件” 的含义,但我想您希望获得最高sub->id

的记录

您可以使用DISTINCT ON获得最高的成绩。

SELECT DISTINCT ON (jae.e->>'name') --for every 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 
                                         --^ return only the row with the highest id

DEMO