4

想象一下下面的示例表:

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 from table group by name 不起作用。它告诉我在 value1 和 value2 上使用聚合函数或分组。

如果我按名称、value1 和 value2 进行分组,那么我会得到以下结果,但由于两行 Hans 的 value1 和 value2 不同:

12:30     Hans     2      4
13:00     Hans     3      5
15:00     Peter    4      4

解决办法是什么?

4

2 回答 2

6

您可以使用子查询来获取max(time)for each 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()or之类的窗口函数rank(),那么您的查询将类似于以下内容:

select time, name, value1, value2
from
(
  select time, name, value1, value2,
    rank() over(partition by name order by time desc) rn
  from yourtable
) src
where rn = 1

请参阅带有两个查询的演示的 SQL Fiddle

于 2013-03-11T11:48:12.533 回答
1

有了distinct on它就很简单了。SQL小提琴

select distinct on (name)
    "time", name, value1, value2
from t
order by t.name, t."time" desc
于 2013-03-11T13:30:01.563 回答