2016-03-23 4 views
1

у меня есть данные в следующем форматеагрегатной функции, чтобы сохранить определенное значение, в зависимости от других столбцов

 
id_A  id_B  val 
-------------------------------- 
1   1   1 
1   2   2 
2   1   3 
2   3   4 

Есть хороший способ группы id_A, сохраняя при этом значения строки, в которой id_A = Id_B?

Причина, по которой мне нужно агрегировать, заключается в том, что если такой линии нет, я хочу средний.

Результат должен выглядеть следующим образом:

 
id_A  val 
----------------- 
1   1 
2   3.5 

Я придумал следующем, но это дело выглядит некрасиво и Hacky ко мне.

Select id_A, 
    Coalesce(
     avg(case when id_A = id_B then val else null end), 
     avg(val) 
    ) as value 
From myTable 
Group by id_A; 
+0

Ваш запрос выглядит хорошо для меня, и я upvoted вас за усилия. –

+0

Какую версию postgres вы используете? –

+0

Я использую postgres 8.3, но спасибо за ваш ответ в любом случае. – Atn

ответ

1

С Postgres 9.4+ вы можете использовать FILTER пункт для агрегатов и оконных функций:

functions. Something like this: 
Select id_A, 
    Coalesce(
     avg(val) filter(where id_A = id_B), 
     avg(val) 
    ) as value 
From myTable 
Group by id_A; 

Подробности здесь: http://www.postgresql.org/docs/current/static/sql-expressions.html