选择最近的日期并计算不同行中多个值的平均值

时间:2014-09-18 20:03:01

标签: sql max aggregate average

我正在为包含多个列的表构建查询:

  • 姓名
  • 日期
  • 大约10列,带有整数值

现在我想返回一个表,该表为name列的每个唯一元素返回一行。 此行有三列:名称,日期和整数值列的平均值。 日期是此特定名称元素的最新日期。 平均值是此特定行的所有整数值的平均值。

SELECT name, Max(date), SUM(value1+value2+value3+value4...+value10)/10 
FROM myTable
WHERE *join statements*
Group by name

问题在于,由于sum汇总了列的所有值,因此计算出的值不是此单行的平均值。 无法将值添加到group by语句中,因为每个名称的结果应仅显示一行。

希望问题很清楚。有任何想法吗?谢谢!


修改 谢谢你的回复戈登林诺夫!我的问题的表述并不那么清楚,对不起。

实际上可能存在具有相同名称和日期的条目。因此,我需要聚合这些条目,以防它是此特定名称元素的最新日期。

澄清一下,这里有一个可能的表格:

|姓名|日期|值1 |值2 |

|姓名A | 14/09/24 | 1 | 2 |

|姓名A | 14/09/24 | 2 | 1 |

|姓名A | 14/09/24 | 9 | 9 |

|姓名A | 14/09/22 | 4 | 3 |

|姓名B | 14/09/23 | 3 | 5 |

|姓名B | 14/09/22 | 2 | 4 |

|姓名B | 14/09/21 | 4 | 2 |

|姓名C | 14/09/23 | 5 | 1 |


结果应该是:

|姓名|日期|平均|

|姓名A | 14/09/24 | 4 |

|姓名B | 14/09/23 | 4 |

|姓名C | 14/09/23 | 3 |

根据您的提示,我认为我找到了针对此问题的正确查询,其中2是每行的值数:

SELECT name, max(date), avg(value1+value2)/2
FROM myTable t
WHERE not exists (select 1
                  from myTable t2
                  where t2.name = t.name and t2.date > t.date
                 )
group by name

1 个答案:

答案 0 :(得分:1)

您实际上并不想要聚合。您想为每个名称选择最近的行。这是一种使用not exists的方法:

SELECT name, date, (value1+value2+value3+value4...+value10)/10 
FROM myTable t
WHERE not exists (select 1
                  from myTable t2
                  where t2.name = t.name and t2.date > t.date
                 );