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.
您可以使用子查询来获取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和两个查询的演示
| 归档时间: |
|
| 查看次数: |
12163 次 |
| 最近记录: |