【问题标题】:How to return percentage in PostgreSQL?如何在 PostgreSQL 中返回百分比?
【发布时间】:2017-02-21 14:02:06
【问题描述】:

创建临时表

CREATE TEMP TABLE percentage(
  gid SERIAL,
  zoom smallint NOT NULL,
  x smallint NOT NULL,
  y smallint NOT NULL
);

插入数据

INSERT INTO percentage(zoom, x, y) VALUES
(0,5,20), 
(0,5,21), (0,5,21),
(0,5,22), (0,5,22), (0,5,22),
(0,5,23), (0,5,23), (0,5,23), (0,5,23),
(0,5,24), (0,5,24), (0,5,24), (0,5,24), (0,5,24),
(1,5,20), 
(1,5,21), (1,5,21),
(1,5,22), (1,5,22), (1,5,22),
(1,5,23), (1,5,23), (1,5,23), (1,5,23),
(1,5,24), (1,5,24), (1,5,24), (1,5,24), (1,5,24);

某个图块出现了多少次(图块x和y表示)

SELECT zoom, x, y, count(*) AS amount 
FROM percentage 
GROUP BY zoom,x,y 
ORDER BY zoom, amount;

结果:

 zoom | x | y  | amount 
------+---+----+--------
    0 | 5 | 20 |      1
    0 | 5 | 21 |      2
    0 | 5 | 22 |      3
    0 | 5 | 23 |      4
    0 | 5 | 24 |      5
    1 | 5 | 20 |      1
    1 | 5 | 21 |      2
    1 | 5 | 22 |      3
    1 | 5 | 23 |      4
    1 | 5 | 24 |      5
(10 rows)

问题

对于特定缩放,如何获取每个图块(x 和 y)的百分比,或者换句话说,对于特定缩放,特定图块显示了多少次?

想要的结果:

 zoom | x | y  | amount | percentage
------+---+----+--------+-----------
    0 | 5 | 20 |      1 |     6.667
    0 | 5 | 21 |      2 |    13.333
    0 | 5 | 22 |      3 |        20
    0 | 5 | 23 |      4 |    26.667
    0 | 5 | 24 |      5 |    33.333
    1 | 5 | 20 |      1 |     6.667
    1 | 5 | 21 |      2 |    13.333
    1 | 5 | 22 |      3 |        20
    1 | 5 | 23 |      4 |    26.667
    1 | 5 | 24 |      5 |    33.333
(10 rows)

*这只是一个样本数据,百分比不应相同,除非纯属巧合!

【问题讨论】:

  • 基于样本数据,所有百分比是否应该不一样,因为它们在每次缩放时出现一次?
  • @vkp 数据只是一个样本,每个缩放级别的百分比很可能不会相同!
  • 这个百分比加起来不等于 100 的逻辑是什么
  • @Prdp 你说的很对,我计算的很不对!对于那个很抱歉!我已经更正了!

标签: sql postgresql percentage postgresql-9.3


【解决方案1】:

如果没有错,你正在寻找这个

SELECT zoom,x,y,
       amount,
       ( amount / Cast(Sum(amount) OVER(partition BY zoom) AS FLOAT) ) * 100 as amt_percentage
FROM   (SELECT zoom,x, y,
               Count(*) AS amount
        FROM   percentage
        GROUP  BY zoom,x,y) a 

甚至

SELECT zoom,x,y,
       Count(*) AS amount,
       ( Count(*) / Cast(Sum(Count(*))OVER(partition BY zoom) AS FLOAT) ) * 100 AS amt_percentage
FROM   percentage
GROUP  BY zoom,x,y 

铸造分母为FLOAT 是避免Integer 除法

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 2020-10-20
    • 2017-05-13
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2019-09-26
    • 2019-02-06
    • 1970-01-01
    相关资源
    最近更新 更多