SQL查询以获取给定键的每个实例的最新行

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)

  • 这在SQL Server中有用吗?在类似的数据上尝试了完全相同的事情,但我为每个"ip"获取一行,只有最新的时间戳. (2认同)

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)

  • 这是最好的答案,因为它不涉及嵌套查询的连接.唯一的问题是它需要在密钥中包含[ip]以及每个问题的用户名. (2认同)

Kim*_*man 8

像这样的东西:

select * 
from User U1
where time_stamp = (
  select max(time_stamp) 
  from User 
  where username = U1.username)
Run Code Online (Sandbox Code Playgroud)

应该这样做.

  • 如果time_stamp是唯一的,那将是可行的,并且您不能假设这一点。 (2认同)