通过在SQL中选择列多列来选择列

时间:2013-03-11 11:44:26

标签: sql postgresql select aggregate-functions

想象一下以下示例表:

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。

2 个答案:

答案 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