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

Vla*_* S. 4 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
Run Code Online (Sandbox Code Playgroud)

我想按最大时间戳和名称进行过滤.

意思是我想得到

13:00     Hans     3      5
15:00     Peter    4      4
Run Code Online (Sandbox Code Playgroud)

使用select max(time),name,value1,value2 from table group by name by not name.它告诉我在value1和value2上也使用聚合函数或组.

如果我按名称,value1和value2分组,那么我得到以下结果,因为两行Hans的value1和value2不同:

12:30     Hans     2      4
13:00     Hans     3      5
15:00     Peter    4      4
Run Code Online (Sandbox Code Playgroud)

解决办法是什么?

编辑:这是一个PostgreSQL.

Tar*_*ryn 5

您可以使用子查询来获取max(time)每个子查询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
Run Code Online (Sandbox Code Playgroud)

根据您使用的数据库,如果您可以应用类似row_number()或的窗口函数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
Run Code Online (Sandbox Code Playgroud)

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