计算postgresql中的百分比

时间:2016-12-29 05:01:19

标签: sql database postgresql percentage cumulative-sum

我有一个返回结果的查询

time  t_count  cumulative_t_count  zone  hour
_____ _____  _________________     ____  ____
1      10          10               1    1
2      20          30               1    1
3      30          60               1    1
4      60          120              1    1

我的查询就像

select time,t_count,sum(t_count) over (order by time) as
   cumulative_t_count ,zone,hour from (select distinct
   time,count(distinct num_id) as t_count,zone,hour from (select * from
   public.table1 where day=1 and time>0 order by time)as A group by
   time,hour,zone order by hour,zone )B where zone=1 and hour=1; 

现在我想要一个额外的列,显示累积计数的百分比,如

time  t_count  cumulative_t_count  zone  hour   percentage_cumulative count
_____ _____  _________________     ____  ____   ____________________________
1      10          10               1     1                  10%
2      20          30               1     1                  30%
3      30          60               1     1                  60%
4      40          100              1     1                  100%

我试过

 select time,t_count,sum(t_count) over (order by time) as
       cumulative_t_count ,cumulative_t_count/sum(t_count) as percentage_cumulative count,zone,hour from (select distinct
       time,count(distinct num_id) as t_count,zone,hour from (select * from
       public.table1 where day=1 and time>0 order by time)as A group by
       time,hour,zone order by hour,zone )B where zone=1 and hour=1; 

但它没有用。感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

为了计算每行对累计总计数的累积计数百分比,您应该在结果集上运行另一个SQL并计算每行的百分比。

我相信查询应该回答你要求的问题。

SELECT time,
t_count,
cumulative_t_count,
zone,
hour,
(((cumulative_t_count)/(sum(cumulative_t_count) OVER (ORDER BY time))) * 100) AS percentage_cumulative_count
FROM
(SELECT
  time,
  t_count,
  SUM(t_count) OVER (ORDER BY time) AS cumulative_t_count,
  zone,
  hour 
 FROM
  (
    SELECT DISTINCT
      time,
      COUNT(DISTINCT num_id) AS t_count,
      zone,
      hour
     FROM
      (
        SELECT
          * 
        FROM
          public.table1 
        WHERE
          day = 1 
          AND time > 0 
        ORDER BY
          time
      )
      AS a 
    GROUP BY
      time,
      hour,
      zone 
    ORDER BY
      hour,
      zone 
  ) b 
WHERE
  zone = 1 
  AND hour = 1) x;

答案 1 :(得分:0)

找到最大t_count值并将每个值除以最大值以查找百分比

试试这个

SELECT time,
       t_count,
       Sum(t_count) OVER(ORDER BY time)           AS cumulative_t_count,
       zone,
       hour,
       ( t_count / Max(t_count) OVER() ) * 100 AS percentage_cumulative,
...