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

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

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

  1. fix_id timestamp age
  2. 10 2 0
  3. 10 2 2
  4. 10 4 0
  5. 10 4 1
  6. 10 4 3
  7. 5 4 2
  8. 5 4 4
  9. 5 3 10

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

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

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

iqih9akk

iqih9akk1#

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

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

vlju58qv2#

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

  1. WHERE age > 0

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

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

请看演示。
结果:

  1. | fix_id | timestamp | average_age |
  2. | ------ | --------- | ----------- |
  3. | 5 | 4 | 3 |
  4. | 10 | 4 | 2 |
展开查看全部

相关问题