SQL查询来获取最新的一行给定键的每个实例(SQL query to get most recent

2019-06-14 18:38发布

我试图获取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  

我期望查询的输出是:

jerry    |  5.6.6.7   |  12
ted      |  8.8.8.8   |  30  

我可以在一个SQL查询做到这一点? 在它的事项的情况下,DBMS是PostgreSQL的。

Answer 1:

试试这个:

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


Answer 2:

与ROW_NUMBER窗函数尼斯完美的解决方案(PostgreSQL支持-参见SQL小提琴 ):

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;


Answer 3:

事情是这样的:

select * 
from User U1
where time_stamp = (
  select max(time_stamp) 
  from User 
  where username = U1.username)

应该这样做。



Answer 4:

上述两个答案假设你只需要为每个用户和TIME_STAMP一行。 根据不同的应用程序和您TIME_STAMP的粒度,这可能不是一个有效的假设。 如果您需要处理TIME_STAMP给定用户的关系,你需要扩展上面给出的答案之一。

要在一个查询写这需要另一个嵌套子查询 - 事情会开始越来越多地凌乱和性能可能会受到影响。

我会喜欢添加这是一个评论,但我还没有50美誉张贴作为一个新的答案很抱歉!



Answer 5:

不能发表评论,但@Cristi小号的答案工程请客我。

在我的方案,我需要只保留最近的3条记录Lowest_Offers所有product_ids。

需要重新修改他的SQL删除 - 认为,这将是确定的,但语法是错误的。

DELETE from (
SELECT product_id, id, date_checked,
  ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY date_checked DESC) rn
FROM lowest_offers
) tmp WHERE > 3;


Answer 6:

我一直在使用这个,因为我要回的另一个表结果。 虽然我试图避免嵌套的加入,如果有帮助瓦特/少了一个步骤。 那好吧。 它返回同样的事情。

select
users.userid
, lastIP.IP
, lastIP.maxdate

from users

inner join (
    select userid, IP, datetime
    from IPAddresses
    inner join (
        select userid, max(datetime) as maxdate
        from IPAddresses
        group by userid
        ) maxIP on IPAddresses.datetime = maxIP.maxdate and IPAddresses.userid = maxIP.userid
    ) as lastIP on users.userid = lastIP.userid


文章来源: SQL query to get most recent row for each instance of a given key