从一列中具有相同值而另一列中具有最大值的每个组中选择avg

nuypyhwy  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(449)

我一直在寻找答案,但似乎没有人有类似的问题,我决定把它张贴在这里。
我有一个表,表中有200条重复值的记录 fix_id 列,在列timestamp中,每个记录都有一个从1到5的值,在最后一列中我得到了年龄值。
我喜欢为中具有相同id的每个组选择 fix_id 列同时保持timestamp列中的max值age列的平均值,还有一个棘手的地方,age列有时可以有值0,在这种情况下,我喜欢跳过这个值。

fix_id   timestamp  age
  10         2        0
  10         2        2
  10         4        0
  10         4        1
  10         4        3
  5          4        2
  5          4        4
  5          3       10

所以从这个表,我想得到这个结果

fix_id    timestamp   age
  10          4         2
  5           4         3

因此,如果年龄列中有0,我不想在计算平均值时包含它。
这有可能吗?

iqih9akk

iqih9akk1#

一种方法是带有筛选的聚合查询:

select fix_id, timestamp, avg(age)
from t
where age > 0 and
      timestamp = (select max(t2.timestamp) from t t2 where t2.fix_id = t.fix_id)
group by fix_id;
vlju58qv

vlju58qv2#

如果在查询中设置如下条件:

WHERE age > 0

那么您将错过max timestamp只包含 0 在列中的 age 你不会明白的 fix_id 在结果中。
所以使用条件聚合:

SELECT t.fix_id, t.timestamp, 
       AVG(CASE WHEN t.age > 0 THEN t.age END) average_age
FROM tablename t
WHERE t.timestamp = (SELECT MAX(timestamp) FROM tablename WHERE fix_id = t.fix_id)
GROUP BY t.fix_id, t.timestamp

请看演示。
结果:

| fix_id | timestamp | average_age |
| ------ | --------- | ----------- |
| 5      | 4         | 3           |
| 10     | 4         | 2           |

相关问题