ala*_*10n 64 sql postgresql greatest-n-per-group
我正在尝试从表中获取ip,用户和最近的时间戳,该表可能包含用户的当前ip和一个或多个先前的ips.我想为每个用户提供一行,其中包含最新的ip和相关的时间戳.所以如果一个表看起来像这样:
username | ip | time_stamp
--------------|----------|--------------
ted | 1.2.3.4 | 10
jerry | 5.6.6.7 | 12
ted | 8.8.8.8 | 30
Run Code Online (Sandbox Code Playgroud)
我希望查询的输出是:
jerry | 5.6.6.7 | 12
ted | 8.8.8.8 | 30
Run Code Online (Sandbox Code Playgroud)
我可以在单个SQL查询中执行此操作吗?如果重要,DBMS就是Postgresql.
Chr*_*sen 93
试试这个:
Select u.[username]
,u.[ip]
,q.[time_stamp]
From [users] As u
Inner Join (
Select [username]
,max(time_stamp) as [time_stamp]
From [users]
Group By [username]) As [q]
On u.username = q.username
And u.time_stamp = q.time_stamp
Run Code Online (Sandbox Code Playgroud)
Cri*_* S. 31
使用ROW_NUMBER窗口函数的优雅解决方案(由PostgreSQL支持 - 请参阅SQL Fiddle):
SELECT username, ip, time_stamp FROM (
SELECT username, ip, time_stamp,
ROW_NUMBER() OVER (PARTITION BY username ORDER BY time_stamp DESC) rn
FROM Users
) tmp WHERE rn = 1;
Run Code Online (Sandbox Code Playgroud)
像这样的东西:
select *
from User U1
where time_stamp = (
select max(time_stamp)
from User
where username = U1.username)
Run Code Online (Sandbox Code Playgroud)
应该这样做.
| 归档时间: |
|
| 查看次数: |
136945 次 |
| 最近记录: |