-1

我有一个存储用户点击信息的表格,例如“so”、“browser”、“timezone”。我需要对每一列进行分解以构建每一列的饼图。我需要一个json结果,例如:

{"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"}]} }

表定义为:

=================================
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 数组,有什么想法吗?

4

1 回答 1

1

这不是一个完整的解决方案,而是更多的提示。我在浏览器列上进行聚合。您的问题中迟到的时间和数据样本的缺失限制了我这一点。无论如何,要添加另一个指标,只需partition over column_name将其添加到构建的 json 中。此外,您可能想使用json_build而不是concat和演员。再次 - 你的问题缺乏信息......

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)
于 2017-03-18T22:32:39.487 回答