如何在 PostgreSQL 中 return 百分比?

How to return percentage in PostgreSQL?

创建临时文件TABLE

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)

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

如果我没记错的话你正在找这个

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除法