2016-10-12 10 views
0

가 임시 테이블을 CREATEPostgreSQL에서 백분율을 반환하는 방법은 무엇입니까?

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); 

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

결과 (타일x와 y로 표현된다) 몇 번이나 특정 타일이 나타납니다 :

(210)
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) 

이 단지 샘플 데이터, 백분율은 순수한 우연의 일치 제외하고, 동일 안된다됩니다 *! 잘못 아니에요 경우

+0

, 줌 당 한 번 발생했기 때문에 모든 백분율이 같지 않아야합니까? –

+0

@vkp 데이터는 샘플 일 뿐이며 비율은 각 확대/축소 수준에서 동일하지 않을 가능성이 높습니다! –

+2

해당 백분율에 대한 논리가 ** 100 **까지 추가되지 않습니다 ** ** 무언가가 잘못되었습니다 –

답변

1

당신이 FLOAT에 분모가 Integer 분열을 피할 수있다 캐스팅이

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 

찾고있는 샘플 데이터를 기반으로

+0

고마워요! 그것은 위대한 작품! –

+0

@newbie_girl - 다행이 당신을 도왔습니다. –