2017-08-30 93 views
1

我有survey_results表,有以下栏目:PostgreSQL的 - 分组通过jsonb列

id - integer 
score_labels - jsonb 

score_labels列数据格式如下:

{"total": "High", "risk": "High"}

现在我想有SQL查询将通过此score_labels列对我的调查结果进行分组和统计。这是最后的结果应该是什么样子:

total       risk 
-------      ------ 
{high: 2, medium: 1, low: 0} {high: 1, medium: 2, low: 1} 

我想指望通过其得分标签的调查结果。 PostgreSQL有办法做到这一点吗?

下面是简单sqlfiddle与下面的模式:

http://sqlfiddle.com/#!17/0367f/1/0

回答

3

一个比较复杂的一种聚合:

with my_table (id, score_labels) as (
values 
(1, '{"total": "High", "risk": "High"}'::jsonb), 
(2, '{"total": "High", "risk": "Low"}'::jsonb), 
(3, '{"total": "Low", "risk": "Medium"}'::jsonb) 
) 

select 
    jsonb_build_object(
     'high', count(*) filter (where total = 'High'), 
     'medium', count(*) filter (where total = 'Medium'), 
     'low', count(*) filter (where total = 'Low') 
    ) as total, 
    jsonb_build_object(
     'high', count(*) filter (where risk = 'High'), 
     'medium', count(*) filter (where risk = 'Medium'), 
     'low', count(*) filter (where risk = 'Low') 
    ) as risk 
from (
    select 
     score_labels->>'total' as total, 
     score_labels->>'risk' as risk 
    from my_table 
    ) s 

       total    |    risk     
------------------------------------+------------------------------------ 
{"low": 1, "high": 2, "medium": 0} | {"low": 1, "high": 1, "medium": 1} 
(1 row)