2015-01-15 3 views
0

Я работаю с гигантским набором данных людей с демографической информацией и отслеживанием действий. Я пытаюсь получить процент людей, которые совершили какое-либо действие, что просто, но также пытается получить средний возраст людей, которые вписываются в определенную подгруппу исходного SELECT. Линия CASE WHEN работает в одиночку, и подзапрос отлично работает в собственном запросе, но я не могу заставить его интегрироваться в этот запрос как подзапрос, он дает мне синтаксическую ошибку в инструкции CASE WHEN. Вот немного анонимная версия запроса. Любая помощь будет ОЧЕНЬ оценена.postgresql Subselect Aggregate in large query

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 лет, которые имели определенное действие

Предполагая, что моя интерпретация верна, этот запрос может работать для вас:

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; 

Я создал таблицу фиктивных данных и заполнил ее следующими данными.

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) 

Из 14 строк, 4 ряда (первые четыре в этом перечислении) имеет либо неправильно website_type или иметь age ниже 30. Из десяти оставшихся строк, вы можете увидеть, что 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