SQL查询以获取给定键的每个实例的最新行
我试图从一个表中获取ip、用户和最近的时间戳,该表可能包含用户的当前ip和一个或多个以前的ip。我希望每个用户有一行包含最新的ip和相关的时间戳。因此,如果一个表如下所示:SQL查询以获取给定键的每个实例的最新行,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我试图从一个表中获取ip、用户和最近的时间戳,该表可能包含用户的当前ip和一个或多个以前的ip。我希望每个用户有一行包含最新的ip和相关的时间戳。因此,如果一个表如下所示: username | ip | time_stamp --------------|----------|-------------- ted | 1.2.3.4 | 10 jerry | 5.6.6.7 | 12 ted |
username | ip | time_stamp
--------------|----------|--------------
ted | 1.2.3.4 | 10
jerry | 5.6.6.7 | 12
ted | 8.8.8.8 | 30
select *
from User U1
where time_stamp = (
select max(time_stamp)
from User
where username = U1.username)
我希望查询的输出是:
jerry | 5.6.6.7 | 12
ted | 8.8.8.8 | 30
我可以在单个sql查询中执行此操作吗?如果重要的话,DBMS是Postgresql。试试这个:
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
大概是这样的:
username | ip | time_stamp
--------------|----------|--------------
ted | 1.2.3.4 | 10
jerry | 5.6.6.7 | 12
ted | 8.8.8.8 | 30
select *
from User U1
where time_stamp = (
select max(time_stamp)
from User
where username = U1.username)
应该这样做。以上两个答案都假设每个用户和时间戳只有一行。根据应用程序和时间戳的粒度,这可能不是一个有效的假设。如果需要处理给定用户的时间戳关系,则需要扩展上面给出的答案之一 要在一个查询中写入此命令,需要另一个嵌套的子查询-事情将开始变得更加混乱,性能可能会受到影响
我很想把这个作为一个评论,但我还没有50%的声誉,所以很抱歉作为一个新的答案发布 我一直在使用它,因为我正在从另一个表返回结果。尽管我试图避免嵌套联接,如果它有助于减少一步。哦,好吧。它返回相同的东西
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
漂亮优雅的解决方案,具有PostgreSQL支持的行数窗口功能-请参见:
现在还不能发表评论,但是@Cristi的回答对我来说很有用 在我的场景中,我只需要为所有产品标识保留最新的3条最低报价记录 需要修改他的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;
我在正确的轨道上,但我不能完全正确地加入。这就成功了。谢谢这在SQL Server中有效吗?在相似的数据上尝试了完全相同的方法,但我得到了每个ip的一行,以及最近的时间戳。用于HANA表,这产生了多行,其中1是预期的。HANA有很多东西与大多数流行的SQL引擎不一样。我认为这就是上述用户响应的答案。。。这不是开始回答问题的好方法。我怎么知道上面的答案是不是你指的?答案可以根据分数按不同的顺序出现。罗伯,我不认为你在告诉他一些他不知道的事情。他无法发表评论,他所指的答案显然有缺陷。更重要的是,传播知识或批评文本的放置位置?更正的SQL:从最低报价中删除,其中选择id中的id来自选择产品\u id、id、日期\u选中,按产品分区上的行数按日期排序检查最低的描述提供tmp,其中rn>3我认为这需要时间段上的描述索引这是最好的答案,因为它不涉及嵌套查询上的联接。唯一的问题是它需要在密钥中包含[ip]以及每个问题的用户名。如果时间戳是唯一的,并且您不能假设它是唯一的,那么这就行了。