2015-10-12 2 views
0

Предположим, у меня есть поля x и y и x могут содержать несколько экземпляров того же значения. Для всех значений в x, которые являются одинаковыми, я хочу построить много новых значений, используя значения y, которые соответствуют значениям x. Например, давайте пусть новое поле можно назвать z:Как назначить значения для всех записей в группе

id x y z 
1 3.5 17 f(17, 9, 11) 
2 3.8 12 f(12, 2) 
3 3.5 9 f(17, 9, 11) 
4 3.5 11 f(17, 9, 11) 
5 4.2 7 f(7) 
6 3.8 2 f(12, 2) 
7 2.1 13 f(13) 

Это что-то вроде предложения GROUP BY, но вместо того, разрушаясь группу в одной записи, я хотел бы, чтобы выделить отдельные записи, которые пошли внутрь.

Функция f, которая применяется, будет только средним значением y, если она делает ее более простой. Но мне интересно, можно ли сформулировать такой запрос в большей общности.

+0

Вы должны пометить свой вопрос в базе данных, которую используете. –

ответ

1

ANSI стандарт SQL поддерживает оконные функции, так что это может быть сделано как:

select t.*, 
     avg(y) over (partition by x) as z 
from t; 

Большинства баз данных поддерживают эти функции.

+0

Спасибо, все. Я буду читать функции окна. –

0

Функции окна - это правильная вещь, но некоторые реализации (например, MySQL) не поддерживают их. Для протокола, вот обходной путь, который работает для MySQL:

select t.*, u.z 
    from t, (select x, avg(y) as z from t group by x) as u 
    where u.x=t.x; 
Смежные вопросы