2015-01-15 1 views
0

저는 인구 통계 정보와 액션 추적을 사용하는 거대한 데이터 세트로 작업하고 있습니다. 나는 행동을 저지른 사람들의 비율을 얻으려고 노력하고 있는데 이것은 간단하다. 원래 SELECT의 특정 하위 그룹에 속한 사람들의 평균 연령을 얻으려고한다. CASE WHEN 라인은 잘 동작하지만 하위 쿼리는 자체 쿼리로 실행되지만 하위 쿼리로이 쿼리에 통합되지는 않습니다. CASE WHEN 문에서 구문 오류가 발생합니다. 약간 익명화 된 버전의 쿼리가 있습니다. 어떤 도움이라도 대단히 감사 할 것입니다. 내가 제대로 당신의 의도를 해석 한 경우postgresql Subselect 큰 쿼리에서 집계

SELECT 
    AVG(ageagg) 
FROM 
    (
     SELECT 
      age AS ageagg 
     FROM 
      agetable 
     WHERE 
      age>30 
     AND action_taken=1) AvgAge_30Action, 
    COUNT(
     CASE 
      WHEN action_taken=1 
      AND age> 30 
      THEN 1 
      ELSE 0 NULL)/COUNT(
     CASE 
      WHEN age>30) AS Over_30_Action 
FROM 
    agetable 
WHERE 
    website_type=3 

답변

0

, 당신은 다음과 같은 계산하려면 :

1) 총 수의 비율로 특정 작업을했다 30 세 이상의 사람의 수 30

2) 내 해석이 올바른 가정 특정 작업

했다 30 세 이상의 사람들의 평균 연령 세 이상의 사람들이 쿼리는 당신을 위해 일 수 있습니다

를3210
SELECT 
    100 * over_30_action/over_30_total AS percentage_of_over_30_took_action, 
    average_age_of_over_30_took_action 
FROM (
    SELECT 
    SUM(CASE WHEN action_taken=1 THEN 1 ELSE 0 END) AS over_30_action, 
    COUNT(*) AS over_30_total, 
    AVG(CASE WHEN action_taken=1 THEN age ELSE NULL END) 
     AS average_age_of_over_30_took_action 
    FROM agetable 
    WHERE website_type=3 AND age>30 
) aggregated; 

더미 테이블을 만들고 다음 데이터로 채 웁니다. 14 행의

postgres=# select * from agetable order by website_type, action_taken, age; 
age | action_taken | website_type 
-----+--------------+-------------- 
    33 |   1 |   1 
    32 |   1 |   2 
    28 |   1 |   3 
    29 |   1 |   3 
    32 |   1 |   3 
    33 |   1 |   3 
    34 |   1 |   3 
    32 |   2 |   3 
    32 |   3 |   3 
    33 |   4 |   3 
    34 |   5 |   3 
    33 |   6 |   3 
    34 |   7 |   3 
    35 |   8 |   3 
(14 rows) 

, 4 행 (이 목록의 첫 번째 네)가 중 잘못된 website_type 또는 열 나머지 행의 (30) 아래 age을 가지고, 당신은 그 중 3은 action_taken의가 있음을 알 수 1. 따라서 쿼리는 30 세 이상의 사람들 중 30 %가 특정 행동을 취하고 그 특정 인구 집단의 평균 연령은 33 세 (32 세, 33 세 및 34 세) 여야한다고 결정해야합니다. 게시 한 검색어의 결과 :

percentage_of_over_30_took_action | average_age_of_over_30_took_action 
-----------------------------------+------------------------------------ 
           30 |    33.0000000000000000 
(1 row) 

다시 말하지만,이 모든 내용은 귀하의 의도가 실제로 정확하다는 것을 전제로합니다. 이것은 물론 고도로 고안된 데이터 세트를 기반으로 합니다만, 올바른 길을 찾아가는 데 필요한 기능적 푯말이면 충분합니다.

+0

이것은 완벽하게 작동했습니다! 고맙습니다! – LearnWorkLearn

관련 문제