我正在为包含多个列的表构建查询:
现在我想返回一个表,该表为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
答案 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
);