如何为组中的所有记录分配值

时间:2015-10-12 23:15:55

标签: sql

假设我有字段xyx可能包含多个相同值的实例。对于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值的平均值,如果它更简单的话。但我想知道是否有可能更广泛地制定这样的问题。

2 个答案:

答案 0 :(得分:1)

ANSI标准SQL支持窗口函数,因此可以这样做:

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

大多数数据库都支持这些功能。

答案 1 :(得分: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;