想象一下以下示例表:
time name value1 value2
12:00 Hans 2 4
12:30 Hans 2 4
13:00 Hans 3 5
14:00 Peter 4 4
15:00 Peter 4 4
我想按最大时间戳和名称进行过滤。
意思是我想要
13:00 Hans 3 5
15:00 Peter 4 4
按名称使用表组中的select max(time),name,value1,value2 不起作用。它告诉我在value1和value2上也使用聚合函数或组。
如果我按名称,value1和value2分组,那么我得到以下结果,因为两行汉斯的value1和value2不同:
12:30 Hans 2 4
13:00 Hans 3 5
15:00 Peter 4 4
解决方案是什么?
编辑: 这是一个PostgreSQL。
答案 0 :(得分:5)
您可以使用子查询获取每个max(time)
的{{1}},然后将其加回到您的表中以获得最终结果:
name
根据您使用的数据库,如果您可以应用select t1.time,
t1.name,
t1.value1,
t1.value2
from yourtable t1
inner join
(
select max(time) MaxTime, name
from yourtable
group by name
) t2
on t1.time = t2.maxtime
and t1.name = t2.name
或row_number()
等窗口函数,那么您的查询将类似于以下内容:
rank()
查看两个查询的SQL Fiddle with Demo
答案 1 :(得分:1)
使用distinct on
非常简单。 SQL Fiddle
select distinct on (name)
"time", name, value1, value2
from t
order by t.name, t."time" desc