2016-01-08 22 views
1

給定一個文本元素數組我想計算出現次數並將它們返回爲帶文本鍵和整數值的子對象。 (PostgreSQL的9.4)PostgreSQL將事件計入json鍵/值

案例1 - 無參考設置

SELECT ARRAY['3G','2G','2G','3G','3G','3G','3G','4G'] 

應轉變到

SELECT '{"2G": 2, "3G": 5, "4G": 1}'::jsonb 

案例2 - 利用參考設置

給定了一組可能的條目ARRAY['2G','3G','4G'],返回的json也應該包含零計數的元素。

SELECT ARRAY['3G','2G','2G','3G','3G','3G','3G'] 

要轉變到

SELECT '{"2G": 2, "3G": 5, "4G": 0}'::jsonb 

我得到了相當接近的情況下,1和2使用

-- case 1 
SELECT json_object(array_agg(r.a)::text[],array_agg(r.num)::text[]) 
FROM (
    SELECT a, count(a) as num 
    FROM unnest(ARRAY['3G','2G','2G','3G','3G','3G','3G','4G']) a 
    GROUP BY a ORDER BY a 
) r; 

--case 2 
SELECT json_object(array_agg(r.ref)::text[],array_agg(r.num)::text[]) 
FROM (
    SELECT ref, count(a) as num 
    FROM unnest(ARRAY['2G','3G','4G']) ref 
    LEFT JOIN unnest(ARRAY['3G','2G','2G','3G','3G','3G','3G']) a ON (ref = a) 
    GROUP BY ref ORDER BY ref 
) r; 

但是,結果返回文本值,例如:

SELECT '{"2G" : "2", "3G" : "5", "4G" : "0"}'::json -- case 2 

感謝您的幫助和反饋!

+0

你沒有在'ARRAY [ '3G' 包括'4G' , '2G', '2G', '3G', '3G', '3G', '3G']'。 – mic4ael

+0

有意展示參考案例! – homat

回答

0

對於你的情況,你可以使用集合json_object_agg()功能,查詢將simplier:

SELECT json_object_agg(r.ref,r.num) result 
FROM (
    SELECT 
    ref, 
    count(a) AS num 
    FROM unnest(ARRAY ['2G', '3G', '4G']) ref 
    LEFT JOIN unnest(ARRAY ['3G', '2G', '2G', '3G', '3G', '3G', '3G']) a ON (ref = a) 
    GROUP BY ref 
    ORDER BY ref 
) r; 

結果是:

   result    
---------------------------------- 
{ "2G" : 2, "3G" : 5, "4G" : 0 } 
(1 row) 
+0

我只是檢查http://www.postgresql.org/docs/9.4/static/functions-json.html上的json函數文檔,並沒有找到'json_object_agg'there。 非常感謝@Dmitry! – homat