2017-03-18 6 views
-1

"so", "browser", "timezone"과 같은 사용자 클릭에 대한 정보를 저장하는 테이블이 있습니다. 각 열의 해체를 만들어 각각의 열 차트를 작성해야합니다.POSTGRES 9.6 : 하나의 쿼리에서 테이블의 각 열의 비율로 분해 (disaggregation)를 수행하려면 어떻게해야합니까?

{"results": { 
       "browser":[{"name":"Chrome","qty":50,"percentage:"50"}, 
         {"name":"Firefox","qty":50,"percentage:"50"}], "SO":[{"name":"Linux","qty":50,"percentage:"50"},{"name":"WIndows","qty":50,"percentage:"50"}]} } 

테이블 정의는 다음과 같습니다 :처럼 나는 JSON 결과를 필요

================================= 
TABLE DEFINITION 
================================= 

Column Type Comment 
sponsor_ad_click_id integer Auto Increment [nextval('ad_clicks_ad_click_id_seq')]  
sponsor_ad_id integer 
clicked_date timestamptz 
browser text NULL  
os text NULL  
device text NULL  
continent_code text NULL  
continent_name text NULL  
country_code text NULL  
country_name text NULL  
timezone text NULL  
ip text NULL  
social_network_id smallint NULL [1]  
sponsor_id integer 

내가 서브 쿼리를 시도했습니다하지만 각 하나에서 하나 개의 값을 반환 할 수

SELECT (select count(spac2.browser) FROM sponsor_ad_clicks spac2 where spac2.sponsor_ad_id = spac.sponsor_ad_id), 
        (select count(spac2.os) FROM sponsor_ad_clicks spac2 wheer spac2.sponsor_ad_id = spac.sponsor_ad_id), 
        (select count(spac2.device) FROM sponsor_ad_clicks spac2 where spac2.sponsor_ad_id = spac.sponsor_ad_id), 
        (select count(spac2.continent_name) FROM sponsor_ad_clicks spac2 where spac2.sponsor_ad_id = spac.sponsor_ad_id), 
        (select count(spac2.country_name) FROM sponsor_ad_clicks spac2 where spac2.sponsor_ad_id = spac.sponsor_ad_id), 
        (select count(spac2.timezone) FROM sponsor_ad_clicks spac2 where spac2.sponsor_ad_id = spac.sponsor_ad_id) 
       FROM sponsor_ad_clicks spac 
       WHERE spac.sponsor_ad_id = 2 

하위 쿼리 당 하나의 값만 반환하므로 분명히 올바르지 않습니다.

json 배열을 만들려고했습니다. 행운, 어떤 아이디어도없이?

답변

1

이것은 완벽한 해결책은 아니지만 어디로 이동할 것인지에 대한 힌트입니다. 브라우저 열에 집계합니다. 늦은 시간과 질문에 데이터 샘플이 없으므로 이에 대한 제한이 있습니다. 어쨌든 다른 메트릭을 추가하려면 partition over column_name을 작성한 다음 json에 추가하십시오. 또한 concat 대신에 json_build을 사용하여 캐스팅 할 수도 있습니다. 다시 - 귀하의 질문에 정보 부족 ...

t=# \pset format unaligned 
Output format is unaligned. 
t=# with j as (
    with agg as (
    select distinct 
     count(1) over (partition by browser) qty 
    , browser 
    , count(1) over (partition by true) total 
    from sponsor_ad_clicks 
) 
    select 
    browser as "name" 
    , qty 
    , qty*100/total percentage 
    from agg 
) 
select 
    jsonb_pretty(concat('{"result":{"browser":',array_to_json(array_agg(to_json(j))),'}}')::jsonb) r 
from j 
; 
r 
{ 
    "result": { 
     "browser": [ 
      { 
       "qty": 2, 
       "name": "chrome", 
       "percentage": 40 
      }, 
      { 
       "qty": 3, 
       "name": "ie", 
       "percentage": 60 
      } 
     ] 
    } 
} 
(1 row)